0

アクティビティに編集テキストが 1 つあります。ユーザーがその編集テキストに触れると、キーボードが開きます。しかし、すべての HTC デバイスで、キーボードを開いた後、ユーザーが戻るボタンを押すと、キーボードだけを非表示にする代わりに、現在のアクティビティが終了し、以前のアクティビティが表示されます。この問題を解決するにはどうすればよいですか? 他のすべてのサムスンモバイルでは、これは正常に機能します。ただし、HTC デバイスにはありません。

4

3 に答える 3

0

率直に言って、私はそれをそのままにして、ユーザーが自分のデバイスで期待する方法でプラットフォームが処理できるようにするつもりです. しかし、私は最近似たような問題に遭遇しました。理想的ではありませんが、キーボードに到達する前に戻るボタンをインターセプトして、好きなように処理することができます。

まず、レイアウトが使用するルート ViewGroup が何であれ、次のような方法でオーバーライドします。

IMEInterceptLayout extends LinearLayout {
    private OnBackPressedPreIMEListener listener;

    public IMEInterceptLayout(Context c) { super(c); }
    public IMEInterceptLayout(Context c, AttributeSet attrs) { super(c, attrs); }
    public IMEInterceptLayout(Context c, AttributeSet attrs, int style) { super(c, attrs, style); }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        switch(event.getKeyCode()) {
            case KeyEvent.KEYCODE_BACK:
                fireOnBackPressedPreIME();
                return true;
            default:
                return super.dispatchKeyEventPreIme(event);
        }
    }

    public void setOnBackPressedPreIMEListener(OnBackPressedPreIMEListener listener) {
        this.listener = listener;
    }

    private void fireOnBackPressedPreIME() {
        if(listener != null) listener.onBackPressedPreIME();
    }

    public interface OnBackPressedPreIMEListener {
        public void onBackPressedPreIME();
    }
}

たとえば、RelativeLayout を使用している場合は、LinearLayout の代わりにそれを拡張します。ストック Android バージョンの代わりに、このカスタム ビューをレイアウトで使用します。

<LinearLayout
    android:id="@+id/my_root_layout"

になる

<com.my.packagename.IMEInterceptLayout
    android:id="@+id/my_root_layout"

次に、onCreate()コンテンツ ビューをこのレイアウトに設定した後、この ViewGroup への参照を取得します。

IMEInterceptLayout layout = (IMEInterceptLayout)findViewById(R.id.my_root_layout);
layout.setOnBackPressedPreIMEListener(new OnBackPressedPreIMEListener() {
    @Override
    public void onBackPressedPreIME() {
        InputMethodManager imm = (InputMethodManager)MyActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
        View focusedView = MyActivity.this.getCurrentFocus();
        if(focusedView != null) 
            imm.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
    }
}

MyActivity明らかに、実際のアクティビティの名前に置き換えます。これにより、システムに頼るのではなく、自分でキーボードを閉じることができます。結果としては比較的手間がかかりますが、信頼できます。

于 2013-03-21T04:52:57.913 に答える
0

同じことをしましたが、同様の問題に遭遇していないため、戻るボタンを 2 回押している可能性があります。Samsung と HTC の両方のデバイスでコードをテストしました。

于 2013-03-21T04:32:27.970 に答える
0

まあ、これはあなたのためにうまくいくかもしれません。次のような onBackPressed イベントでキーボードが開いているかどうかを確認できます。

public void onBackPressed() {
        final View activityRootView = findViewById(R.id.activityRoot);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
                if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                   InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
                }
             } else {
                 super.onBackPressed();
             }
        });
}

次に、上記のコードのように最初にキーボードを閉じることができ、最後に背面をもう一度押すと、super.onBackPressed(); を使用して戻ることができます。

于 2013-03-21T04:33:44.620 に答える