Tra*_*vis 10 android android-ui
我有以下代码在进入我的应用程序时立即显示软键盘:
@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);
...
}
Run Code Online (Sandbox Code Playgroud)
但是,在Android 2.1模拟器上,键盘会出现,然后立即消失.如果我延迟更长时间,比如1000,它会可靠地出现.在Android 4.0模拟器上,延迟100可靠地显示键盘,但较短的延迟不会.
有谁知道谁可能隐藏键盘?是否有可靠的方法来预防它?如果没有,是否有延迟我可以用来保证键盘显示?
如果我理解正确,我认为您可以删除以下代码onResume():
myEditText.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(myEditText, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
Run Code Online (Sandbox Code Playgroud)
只需android:windowSoftInputMode="stateAlwaysVisible"在清单中使用您的活动.
我认为你所看到的是Android识别视图,该视图应该默认获得焦点并使其聚焦(隐藏键盘).将延迟设置得更长或更短只会使代码在设置焦点之前或之后运行.您可以确定默认情况下哪个视图获得焦点,如果您不希望它具有焦点,请将其设置为focusable false和focusableInTouchMode false.如果它确实需要在某个时刻有焦点,你可以设置一个onFocusChanged监听器,当它第一次得到焦点时,发布你的runnable(没有延迟)将焦点放到EditText并打开键盘.
感谢@Daniel Smith 和@Cookster。
发生这种情况是因为我没有在清单中设置 windowSoftInputMode,因此它使用默认值(stateUnspecified),该值在启动时隐藏键盘。显然,该设置是在恢复延迟一段时间后应用的,因此,只有当我的延迟长于隐藏键盘的内置延迟时,我对显示键盘的调用才起作用。
为了解决这个问题,我设置了 windowSoftInputMode="stateUnchanged",然后我总是在 onResume 中隐藏或显示键盘。我还删除了延迟,一旦内置隐藏不再发生,就不再需要延迟。
没关系,这缓解了问题(它让我减少了延迟),但它并没有完全解决问题。这有一些非常不确定的东西,如果我不使用延迟,键盘将不再出现。然而,如果我重新引入大约 100 毫秒的延迟,键盘似乎会在大约 90% 的时间出现,这让我回到了开始的地方:为什么会发生这种情况以及什么是安全延迟?
| 归档时间: |
|
| 查看次数: |
4911 次 |
| 最近记录: |