我有以下代码,以便在进入我的应用时立即显示软键盘:
@Override
protected void onResume() {
super.onResume();
...
myEditText.requestFocus();
myEditText.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(myEditText, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
...
}
然而,在Android 2.1模拟器上,键盘出现然后立即消失。如果我延迟更长时间,如1000,它会可靠地出现。在Android 4.0仿真器上,延迟100可靠地显示键盘,但更短的延迟不会。
有谁知道谁可能隐藏键盘?是否有可靠的方法来预防它?如果没有,我可以用延迟来保证键盘显示吗?
答案 0 :(得分:7)
如果我理解正确,我认为您可以在onResume()
中删除以下代码:
myEditText.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(myEditText, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
只需在清单中使用android:windowSoftInputMode="stateAlwaysVisible"
作为您的活动。
答案 1 :(得分:5)
我认为你所看到的是Android识别视图,该视图应该默认获得焦点并使其聚焦(隐藏键盘)。将延迟设置得更长或更短只会使代码在设置焦点之前或之后运行。您可以确定默认情况下哪个视图获得焦点,如果您不希望它具有焦点,请将其设置为focusable false和focusableInTouchMode false。如果它确实需要在某个时刻有焦点,你可以设置一个onFocusChanged监听器,当它第一次得到焦点时,发布你的runnable(没有延迟)将焦点提供给EditText并打开键盘。
答案 2 :(得分:1)
感谢@Daniel Smith和@Cookster。
这是因为我没有在我的清单中设置windowSoftInputMode,所以它使用了默认值(stateUnspecified),它在启动时隐藏了键盘。显然,该设置是在恢复后延迟一段时间后应用的,因此,如果我的延迟时间长于内置延迟以隐藏它,我的显示键盘的调用才有效。
要修复,我设置windowSoftInputMode =“stateUnchanged”,然后我总是隐藏或显示onResume中的键盘。我也删除了延迟,一旦内置隐藏没有发生就不再需要了。
没关系,这减轻了问题(它让我减少了延迟),但它并没有完全修复它。这有一些非常不确定的东西,如果我不使用延迟,键盘就不再出现了。但是,如果我重新引入大约100毫秒的延迟,键盘似乎会出现大约90%的时间,这让我回到了我开始的地方:为什么会发生这种情况,什么是安全延迟?
答案 3 :(得分:0)
将此代码放在 onResume()方法的 onRun()中:
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
<强> [编辑] 强>
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
text.requestFocus();
text.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(text, InputMethodManager.SHOW_FORCED);
}
}, 100);
text.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(text.getWindowToken(), 0);
}
}, 200);
}