0

Android アプリ (フルスクリーン、ランドスケープ) があり、2 つのビューがあります。1 つはFrameLayout常に表示される で、もう 1 つはLinearLayoutです。の可視性LinearLayoutView.GONEすぐに設定しました。ユーザーが のボタンをタップすると、 のFrameLayout可視性を に設定LinearLayoutview.VISIBLE、 を使用しInputMethodManagerて の にソフト入力を表示しEditTextますLinearLayout。これにより、EditText が画面上のキーボードのすぐ上に表示されるように、両方のビューが上に移動します。これで問題ありません。

ソフト入力を閉じると問題が発生します。同じコールバックで、LinearLayout( を使用してEditText)の可視性を に設定しましView.GONEた。私が見ているのは、FrameLayout が画面の上で動かなくなっていることです (下に移動しません)。を GONE 化しないとLinearLayout、両方のビューが正常に下に移動します。

可視性を に設定する前に待機するタイマーを開始することで問題を回避できますGONEが、そうする必要はありません。をいつ非表示にできるかを示す、一貫して受信できる通知があるはずLinearLayoutです。

私が試しhideSoftInputFromWindowたこと: (結果受信者のコールバックはすぐに呼び出されます (つまり、キーボードが実際に消える前)、ビューがあまりにも早く消えてしまう、同じ問題)、 (ソフト入力時に呼び出されないResultReceiver) の onLayout をオーバーライドしますLinearLayoutビューを上下に移動します)、他のView「オン」をオーバーライドします。

もう1つの本当に厄介なことは、この問題が私の電話に限定されているように見えることです.AT&T Samsung Galaxy SII SkyrocketでAndroid 4.0.4を実行しています(おそらくSamsungの変更が加えられています)。私は 4.0.3 シミュレーターで再現できません。また、他の Android バージョンの他のデバイスで再現することもできません。

何か案は?

4

1 に答える 1

0

独自のタッチ イベント ハンドラを作成する必要があります。ソフト入力が非表示のときに、frameLayout ビュー全体を下にスライドさせる例を次に示します。ご覧のとおり、スーパー ハンドラーを呼び出して、textEdit ウィジェットのテストでコードをラップすることが重要です。計算を確認したい場合は、デバッグ ロガー コードのコメントを外してください。

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();

        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        // Log.d("Activity",
        // "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }

    return ret;

}
于 2017-01-24T16:48:20.873 に答える