我的活动中有一个编辑文本。当用户触摸该编辑文本时,键盘打开。但在所有 HTC 设备中,打开键盘后,当用户按下后退按钮时,我当前的活动已完成并显示以前的活动,而不是只隐藏键盘。如何解决这个问题?在所有其他三星手机中,这工作正常。但不是在 HTC 设备中。
问问题
1194 次
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
您可能按了两次后退按钮,因为我做过同样的事情,但没有遇到类似的问题。我已经在三星和 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 回答