在Android中按返回按钮时防止软键盘关闭

42

我有一个带EditText的活动。当活动启动时,我总是专注于那个EditText。 我通过添加代码使得软键盘始终可见。

android:windowSoftInputMode="stateAlwaysVisible" 

在清单文件中,我正在执行软键盘完成按钮按下的功能。实际上,我需要的是当用户在此活动上时,软键盘应始终存在。 现在,我通过重写返回按钮并什么都不做来禁用了它。

@Override
public void onBackPressed() {
    // Do nothing
}

但是当按下返回键时,软键盘会关闭。如何摆脱这个问题。我尝试过Prevent soft keyboard from being dismissed,但仍然在按下返回键时键盘被隐藏了。但通过再次按下返回键,键盘又回来了。我的需求是按下返回键不应该关闭软键盘。感谢任何帮助。


2
@HareshChhelana 请完整阅读问题。 - Jesbin MJ
3
我的意图并不是关闭/隐藏软键盘。而是防止在按下返回按钮时关闭键盘。 - Jesbin MJ
2
这不是一个重复的问题。为什么你们不仔细阅读问题,而只是将其标记为重复? - Cheok Yan Cheng
显然不是一个重复的问题! - Hoang Nguyen Huu
这个重复没有意义。防止解雇和编程上的显示/隐藏根本不是一回事。投票重新开放。 - Ryan M
1个回答

24

创建一个自定义的EditText,像下面这样带有一个接口:

public class CustomEditText extends EditText {


    public void setHandleDismissingKeyboard(
        handleDismissingKeyboard handleDismissingKeyboard) {
           this.handleDismissingKeyboard = handleDismissingKeyboard;
    }

    private handleDismissingKeyboard handleDismissingKeyboard;

    public interface handleDismissingKeyboard {
        public void dismissKeyboard();
    }

    @SuppressLint("NewApi")
    public CustomEditText(Context context, AttributeSet attrs,
                             int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        // TODO Auto-generated constructor stub
    }

    public CustomEditText(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }


    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_UP) {
            handleDismissingKeyboard.dismissKeyboard();
            return true;
        }
        return super.dispatchKeyEvent(event);
    }

那么在您的活动中创建并初始化您的CustomEditText,然后使用:

customEditText.setHandleDismissingKeyboard(this);

然后实现类并覆盖方法,将你的代码放在其中。

如果想了解更多关于我的回答的信息,你需要的所有东西都是onKeyPreIme,你可以在你的EditText类中重写它(就像我为你发布的那样),来处理所有键盘上的按键,例如返回键或任何其他键盘按键。 我在自定义类中放了一个内部接口,用于从该类到你想要的每个活动或类中获取回调。你也可以使用静态方法实现这一点,如果你希望防止键盘消失,只需在其中返回true即可。

要使用CustomEditText,你可以在xml中使用它,也可以在java代码中定义和初始化它,就像其它小部件(按钮、文本视图等)一样。唯一的区别是你需要像下面这样在你的xml中定义它:

 <yourPackage.CustomEditText ..... />

1
这个答案似乎有些冗长 - onKeyPreIme() 可以更好地解释为主要答案,并且额外的类可以作为如何使用它的示例给出。 - ataulm
@ataulm 我可以再解释更多,但我觉得不需要更多的解释。无论如何,感谢您通知我并提出建议。由于我的英语不好,我希望这已经足够了 :) - Shayan Pourvatan
@JesbinMJ 很高兴能帮助到你。 - Shayan Pourvatan

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