アクティビティに編集テキストが 1 つあります。ユーザーがその編集テキストに触れると、キーボードが開きます。しかし、すべての HTC デバイスで、キーボードを開いた後、ユーザーが戻るボタンを押すと、キーボードだけを非表示にする代わりに、現在のアクティビティが終了し、以前のアクティビティが表示されます。この問題を解決するにはどうすればよいですか? 他のすべてのサムスンモバイルでは、これは正常に機能します。ただし、HTC デバイスにはありません。
3 に答える
率直に言って、私はそれをそのままにして、ユーザーが自分のデバイスで期待する方法でプラットフォームが処理できるようにするつもりです. しかし、私は最近似たような問題に遭遇しました。理想的ではありませんが、キーボードに到達する前に戻るボタンをインターセプトして、好きなように処理することができます。
まず、レイアウトが使用するルート 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
明らかに、実際のアクティビティの名前に置き換えます。これにより、システムに頼るのではなく、自分でキーボードを閉じることができます。結果としては比較的手間がかかりますが、信頼できます。
同じことをしましたが、同様の問題に遭遇していないため、戻るボタンを 2 回押している可能性があります。Samsung と HTC の両方のデバイスでコードをテストしました。
まあ、これはあなたのためにうまくいくかもしれません。次のような 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(); を使用して戻ることができます。