软键盘仅在第一次EditText获得焦点时弹出

19

感谢阅读。

我遇到了一个奇怪的问题:我的应用程序行为是这样的,当 Activity 启动时,我在一个 EditText 上调用了 requestFocus() 并显示软键盘。

然而,当我按下后退按钮以关闭键盘,并点击 EditText ,我再也无法弹出键盘。唯一的解决方法是重新启动 Activity

这是我的代码:


EditText editText = (EditText) findViewById(R.id.editText);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(imm != null) {
            imm.toggleSoftInput(0, 0);
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);    
        }

以下是我的 XML:


<EditText android:id="@+id/editText" 
        android:layout_width="wrap_content"
        android:imeOptions="actionSearch" android:hint="Test Hint"
        android:layout_height="wrap_content" android:layout_centerHorizontal="true" 
        android:maxLength="30"> 
</EditText>
任何帮助都将不胜感激! 谢谢!
6个回答

60

尝试使用 Runnable 来打开和隐藏,例如:

打开

                 ettext.requestFocus();
                 ettext.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager keyboard = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                        keyboard.showSoftInput(ettext, 0);
                    }
                },200);

关闭

                    ettext.requestFocus();
                    ettext.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager keyboard = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                        keyboard.hideSoftInputFromWindow(ettext.
                                                         getWindowToken(), 0);
                    }
                },200);

1
成功了!不过我只是使用了打开键盘的代码。我只需按下返回键即可隐藏键盘。谢谢! :) - Sagar Hatekar
适用于SDK 17 / 最低版本8 / 目标版本17! - Idemax
我在来到这个页面之前已经完成了相同的解决方案 - 但我只是想要一个关于为什么我们的解决方案有效的解释。 - Ryhan

6
您使用了错误的视图来显示输入窗口。
EditText editText = (EditText) findViewById(R.id.editText);
editText.requestFocus();
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null) {
    imm.showSoftInput(editText, 0); 
}

谢谢指出,我已经纠正了。这是在构建问题时的一个打字错误。但原始代码是正确的。 - Sagar Hatekar

4

试试这个:

final InputMethodManager imm = (InputMethodManager)EnterWordsActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null)
    {
        imm.toggleSoftInput(YOUE_EDTITE_TEXT.SHOW_FORCED,1);
    }

你的意思是 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 1); 对吧?如果是,那没用 :( 感谢你的时间。 - Sagar Hatekar
@SagarHatekar 你可能已经在你的清单中添加了一些内容。我已经尝试了很多次,它可以正常工作。 - Shreyash Mahajan

1

在请求焦点之前,直到我清除了力量textField.clearFocus();,上述所有内容都不起作用,因此我的最终代码在onResume中如下。

   @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
        resumed = true;
        textField.postDelayed(new Runnable() {
            @Override
            public void run() {
                textField.clearFocus();
                textField.requestFocus();
                if (!editMode)
                    textField.getText().clear();
                inputMathodType = SharedPref.read(SharedPref.KEY_INPUT_MATHOD_SHARED_PREF, -1);
                setInputMethod();

            }
        }, 200);
    }

0

在您的Activity中使用此代码,它将隐藏您的键盘 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接