2016-04-28 13 views
0

HALLO! Ich erweitere derzeit ein Android Game Framework, das ich in einem Buch von Mario Zechner (der auch Libgdx entwickelt) gefunden habe.Android Soft-Tastatur in einer Vollbild-Oberfläche Ansicht

Es funktioniert bisher sehr gut und ich erreichte eine Java Desktop-Implementierung des Framework.

Aber ein kleines Ding fehlt, die korrekte Verwendung des SoftKeyboard.

können Sie ausprobieren und meine Fehler reproduzieren, ist das gesamte Projekt auf Github, und das Android-Modul ist die „App“ Ordner. Die Java-Version (linke Pfeiltaste = Taste zurück) befindet sich im javalib-Modul.

https://github.com/Railwanderer/AndroidGameFramework

Das Framework verwendet Fenster FullScreenFlags und NoTitle Flags in Kombination mit einer Oberflächenansicht zur Wiedergabe.

Die Flaggen in AndroidGame Klasse:

// set FullScreen 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

Die Oberflächenansicht:

public class AndroidFastRenderView extends SurfaceView implements Runnable { 

AndroidGame game; 
Bitmap framebuffer; 
Thread renderThread = null; 
SurfaceHolder holder; 

// Fps Counting Stuff... 
static long    lastTime; 
static double   fps; 
static String   FPS = ""; 


volatile boolean running = false; 


public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) { 
    super(game); 
    this.game = game; 
    this.framebuffer = framebuffer; 
    this.holder = getHolder(); 
} 

public void resume() { 
    running = true; 
    renderThread = new Thread(this); 
    renderThread.start(); 
} 

public void run() { 
    Rect dstRect = new Rect(); 
    long startTime = System.nanoTime(); 
    while (running) { 
     if (!holder.getSurface().isValid()) 
      continue; 

     lastTime = System.nanoTime(); 
     float deltaTime = (System.nanoTime() - startTime)/1000000000.0f; 
     startTime = System.nanoTime(); 

     game.getCurrentScreen().update(deltaTime); 
     Graphics g = game.getGraphics(); 
     g.clear(Color.BLACK); 
     game.getCurrentScreen().present(deltaTime); 
     g.drawString(FPS,framebuffer.getWidth()-100,framebuffer.getHeight()-30); 

     Canvas canvas = holder.lockCanvas(); 
     canvas.getClipBounds(dstRect); 
     canvas.drawBitmap(framebuffer, null, dstRect, null); 
     holder.unlockCanvasAndPost(canvas); 

     //one second(nano) divided by amount of time it takes for one frame to finish 
     fps = 1000000000.0/(System.nanoTime() - lastTime); 
     lastTime = System.nanoTime(); 
     FPS = "FPS: " + (int) fps; 
    } 
} 

public void pause() { 
    running = false; 
    while (true) { 
     try { 
      renderThread.join(); 
      break; 
     } catch (InterruptedException e) { 
      // retry 
     } 
    } 
} 

Mein Problem ist, wenn ich versuche, das Softkeyboard zu ziehen, würde es zeigen, wenn mit SHOW_FORCED Aufruf . Es liegt auch oben auf meiner Oberflächenansicht, aber die Berührungsereignisse werden die Tastatur nicht auslösen, sondern irgendwie durchgehen und meine Oberflächenansicht treffen.

public void showKeyboard(){ 
    inputManager.showSoftInput(view, InputMethodManager.SHOW_FORCED); 
} 

Als ich traf den obersten Rand der Soft-Tastatur (erste Zeile Tasten Oberkanten) wie verrückt, schließlich einige Touch-Ereignisse auslösen tatsächlich die Schlüssel. Aber es funktioniert nur für die erste Zeile der Tasten und überhaupt nicht befriedigend. Ich bekomme den Eindruck, dass das Ganze verschoben ist, da die aufgezeichneten Touch-Events mit einem Offset zurückkommen.

Ich rufe derzeit die Soft-Tastatur mit einem beliebigen KeyEvent (first line onKey() -Methode des Schlüssels Listener). Die Rücktaste löst also die Tastatur aus. Dieser Schlüssel wird immer erkannt, da es sich um einen Hardkey auf meinem Gerät handelt.

- Gibt es eine Möglichkeit, Vollbild mit einem veränderbaren Layout zu archivieren? Ich denke, es sind die Flags, die verhindern, dass die Tastatur richtig funktioniert. -alle anderen Ideen, die beiden zu kombinieren?

Zusätzlich hier mein Android-Manifest, das einzige XML-Datei diese App verwendet:

<application android:icon="@mipmap/ic_launcher" android:label="TestGame"> 

    <activity android:name="railwanderer.androidgameframework.ExampleAndroidGame.StartClass" 
     android:label="StartClass" 
     android:screenOrientation="landscape" 
     android:configChanges="keyboard|keyboardHidden|orientation"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

    </activity> 
</application> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="9"/> 

Antwort

1

fand ich eine Lösung: D https://stackoverflow.com/questions/33561137/soft-keyboard-not-receiving-touches-over-surfaceview

I außer Kraft gesetzt hat Methode auf die onCreateInputConnection CustomSurfaceView Klasse, wie im geposteten Link.

@Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection conn = super.onCreateInputConnection(outAttrs); 
    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN; 
    return conn; 
} 

es jetzt funktioniert, pls versuchen Sie es aus, ich sofort laden zu sehen, ob es auch auf Ihrem Gerät funktioniert.

Verwandte Themen