Программная клавиатура Android в полноэкранном режиме

HI! В настоящее время я расширяю платформу Android Game Framework, которую я нашел в книге, написанной Марио Зехнером (который также разрабатывает Libgdx).

Он отлично работает до сих пор, и я выполнил реализацию Java Desktop Framework.

Но одна крошечная вещь отсутствует, правильное использование SoftKeyboard.

Вы можете попробовать и воспроизвести мою ошибку, весь проект находится на github, и модуль android является папкой "приложение". Версия java (клавиша с левой стрелкой = клавиша) находится в модуле javalib.

https://github.com/Railwanderer/AndroidGameFramework

В Framework используются окна FullScreenFlags и NoTitle Flags в сочетании с представлением поверхности для рендеринга.

Флаги в классе 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);
}

Когда я нажимаю самую верхнюю границу мягкой клавиатуры (верхние края первой строки), как сумасшедшие, в конечном итоге некоторые сенсорные события фактически вызывают ключи. Но он работает только для первой линии ключей и не удовлетворяет вообще. Я получаю Impression, что все это смещается, поскольку записанные события касания возвращаются со смещением.

В настоящее время я вызываю мягкую клавиатуру с любым ключом (first line 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"/>

Ответ 1

Я нашел решение: D https://stackoverflow.com/info/33561137/soft-keyboard-not-receiving-touches-over-surfaceview

Я переопределил метод onCreateInputConnection в классе CustomSurfaceView, как в опубликованной ссылке.

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

он работает сейчас, попробуйте, попробуйте, я сразу же загружу, чтобы узнать, работает ли оно на вашем устройстве.