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

时间:2013-02-20 06:28:23

标签: 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);

    ...

}

然而,在Android 2.1模拟器上,键盘出现然后立即消失。如果我延迟更长时间,如1000,它会可靠地出现。在Android 4.0仿真器上,延迟100可靠地显示键盘,但更短的延迟不会。

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

4 个答案:

答案 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);
}