5

私はこれについて一日中頭を悩ませてきました。私の活動の1つ(そして1つだけ)で、仮想キーボードを呼び出すと、スライド式の引き出しハンドルがその上に表示されます。問題のアクティビティを含む Manafest.xml ファイルのすべてのアクティビティに android:windowSoftInputMode="adjustPan" を配置することで、アプリの他のすべてのアクティビティでこの問題を修正できました。また、アクティビティのどのオブジェクトにもフォーカスがないことを確認できた限り(フォーカスがある場合は、それを見つける方法がわかりません)。this.getCurrentFocus() を使用してフォーカスをチェックし、返されたビューがあればそれに対して view.clearFocus() を実行しました。これまでのところ、何もフォーカスされていないことがわかる限り、ビューは返されていません。

何か案は?

4

1 に答える 1

0

これは私の回避策です.. EditText を保持するアクティビティには、拡張するサブクラスがありますEditText。このサブクラスでonMeasure()は、キーボードが開いているかどうかを確認するメソッドをオーバーライドします。

    public static class MyEditText extends EditText {
            MyActivity context;

            public void setContext(MyActivity context) {
                this.context = context;
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                int height = MeasureSpec.getSize(heightMeasureSpec);
                Activity activity = (Activity)getContext();
                Rect rect = new Rect();
                activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
                int statusBarHeight = rect.top;
                int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
                int diff = (screenHeight - statusBarHeight) - height;
                // assume all soft keyboards are at least 128 pixels high
                if (diff>128)
                     context.showHandle(false);
                else
                     context.showHandle(true);

                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
    }

次に、アクティビティで、キーボードが開いている場合、ドロワー ハンドルは 1px x 1px の透明な画像に設定されます。キーボードが非表示の場合、実際のハンドルが表示されます。

private void showHandle(boolean show) {
    ImageView drawer_handle = (ImageView) findViewById(R.drawable.handle);
    if (show)
            drawer_handle.setImageResource(R.drawable.handle);
    else
            drawer_handle.setImageResource(R.drawable.handle_blank);
}

最後に、次のことを確認してsetContext()くださいonCreate()MyActivity

MyEditText met = (MyEditText) findViewById(R.id.edit_text);
met.setContext(this);
于 2012-02-03T03:09:16.807 に答える