为什么简历中隐藏了软键盘?

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可靠地显示键盘,但较短的延迟不会.

有谁知道谁可能隐藏键盘?是否有可靠的方法来预防它?如果没有,是否有延迟我可以用来保证键盘显示?

Joe*_*Joe 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);
Run Code Online (Sandbox Code Playgroud)

只需android:windowSoftInputMode="stateAlwaysVisible"在清单中使用您的活动.


Jes*_*ers 5

我认为你所看到的是Android识别视图,该视图应该默认获得焦点并使其聚焦(隐藏键盘).将延迟设置得更长或更短只会使代码在设置焦点之前或之后运行.您可以确定默认情况下哪个视图获得焦点,如果您不希望它具有焦点,请将其设置为focusable false和focusableInTouchMode false.如果它确实需要在某个时刻有焦点,你可以设置一个onFocusChanged监听器,当它第一次得到焦点时,发布你的runnable(没有延迟)将焦点放到EditText并打开键盘.


Tra*_*vis 1

感谢@Daniel Smith 和@Cookster。

发生这种情况是因为我没有在清单中设置 windowSoftInputMode,因此它使用默认值(stateUnspecified),该值在启动时隐藏键盘。显然,该设置是在恢复延迟一段时间后应用的,因此,只有当我的延迟长于隐藏键盘的内置延迟时,我对显示键盘的调用才起作用。

为了解决这个问题,我设置了 windowSoftInputMode="stateUnchanged",然后我总是在 onResume 中隐藏或显示键盘。我还删除了延迟,一旦内置隐藏不再发生,就不再需要延迟。

没关系,这缓解了问题(它让我减少了延迟),但它并没有完全解决问题。这有一些非常不确定的东西,如果我不使用延迟,键盘将不再出现。然而,如果我重新引入大约 100 毫秒的延迟,键盘似乎会在大约 90% 的时间出现,这让我回到了开始的地方:为什么会发生这种情况以及什么是安全延迟?