11

我有如下代码,可以在进入我的应用程序时立即显示软键盘:

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

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

4

4 回答 4

6

如果我理解正确,我认为您可以删除以下代码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"在清单中用于您的活动。

于 2013-03-03T05:27:50.683 回答
5

我认为您所看到的是 Android 识别默认情况下应获得焦点的视图并为其提供焦点(隐藏您的键盘)。将延迟设置得更长或更短只会使您的代码在设置焦点之前或之后运行。您可以弄清楚默认情况下哪个视图获得焦点,如果您不希望它获得焦点,请将其设置为 focusable false 和 focusableInTouchMode false。如果它确实需要在某个时候获得焦点,您可以设置一个 onFocusChanged 侦听器,当它第一次获得焦点时,发布您的可运行对象(无延迟)以将焦点提供给 EditText 并打开键盘。

于 2013-03-05T17:14:07.483 回答
1

感谢@Daniel Smith 和@Cookster。

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

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

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

于 2013-02-20T07:07:30.273 回答
0

put this code in onRun() in onResume() method:

InputMethodManager imm = (InputMethodManager)getSystemService(
                      Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

[Edit]

@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);
}
于 2013-03-07T07:57:00.270 回答