全屏表面视图中的Android软键盘

HI! 我目前正在扩展一个Android游戏框架,我在Mario Zechner撰写的一本书(他也开发Libgdx)中发现了这个框架。

到目前为止,它的工作非常出色,我完成了该框架的Java桌面实现。

但是有一个小小的缺失,SoftKeyboard的正确用法。

您可以尝试并重现我的bug ,整个项目在github上,android模块是“app”文件夹。 Java版本(左箭头键=键返回)位于javalib模块中。

https://github.com/Railwanderer/AndroidGameFramework

该框架使用Window FullScreenFlags和NoTitle Flags结合Surface View进行渲染。

AndroidGame类中的标志:

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

表面视图:

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
        }
    }
}

我的问题是当我试图拉起SoftKeyboard时 ,它会显示与SHOW_FORCED调用。 它也在我的表面视图上放置,但触摸事件不会触发键盘,但会以某种方式通过并打到我的表面视图。

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

当我像疯了一样击中软键盘的最上边缘(第一行键上边缘)时,最终一些触摸事件实际上触发键。 但它只适用于第一行按键,并且根本不令人满意。 我得到了印象,因为记录的触摸事件返回一个偏移量,整个事件发生了变化。

我目前正在用任何keyEvent(关键侦听器的第一行onKey()方法)调用软键盘。 所以后退键会触发键盘。 此密钥始终可以识别,因为它是我设备上的硬键。

- 是否有可能通过可调整大小的布局存档全屏? 我猜它的标志阻止键盘正常工作。 还有其他想法可以将两者结合起来吗?

另外在这里我的android清单,这个应用程序使用的唯一的xml文件:

<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"/>


我发现了一个解决方案:D https://stackoverflow.com/questions/33561137/soft-keyboard-not-receiving-touches-over-surfaceview

我在CustomSurfaceView类上重写了onCreateInputConnection方法,就像在发布的链接中一样。

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

它现在可以运行,请尝试一下,我会马上上传,看看它是否也适用于您的设备。

链接地址: http://www.djcxy.com/p/93363.html

上一篇: Android soft keyboard in a fullscreen Surface View

下一篇: How to open only half keyboard in Landscape mode?