Android:防止软键盘在聊天窗口中关闭

问题描述

我正在制作一个聊天应用程序,并希望在聊天窗口可见时保持软键盘打开。当用户点击同一页面上的任何其他控件时,键盘不应隐藏。我的视图层次结构如下所示:

LinearLayout
   RecyclerView
   LinearLayout

子线性布局有一个 EditText一个用于发送消息的按钮。显示页面后,我请求将焦点放在编辑文本上并显示带有 SHOW_FORCED 标志的软输入。问题是当我点击 RecyclerView 或发送按钮时,如果编辑文本具有焦点,则键盘将隐藏。

是否可以确保编辑文本永远不会失去焦点(从而防止键盘消失)?我能够在 iOS 上轻松完成此操作,但我在 Android 上遇到了困难。

解决方法

如果你想获得 editText 的焦点而不是失去使用它,它对我有用

    edit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v,boolean hasFocus) {
    if(!edit.hasFocus()){
        edit.requestFocus();
    }
  }
});
,

请记住,我没有尝试构建它,因为它很复杂。如果有时间,我会尝试添加一个示例。

我猜您想构建类似于 whatsapp 的东西。在我看来,最有前途的方法是在您的根 linearLayout 中设置一个全局 touchListener,它消耗所有触摸事件同时使孩子无法聚焦,因此允许您手动处理所有触摸事件。如果您检测到滑动触摸,请相应地滚动 recyclerview。如果您在编辑文本区域检测到触摸,请设置焦点并打开键盘。这样触摸不会改变焦点状态,保持键盘打开。请记住,您可能必须处理所有其他触摸场景。首先创建侦听器并使除第一个布局之外的所有内容都不要关注触摸,然后构建您的特定交互。

,

您可以做的是,当 EditText 失去焦点时,重新聚焦并显示键盘。但这只是解决方法。如果你能分享你到目前为止所做的事情,那就很容易了。

editText.setOnFocusChangeListener( new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v,boolean hasFocus) {
        if(!editText.hasFocus()) {
            editText.requestFocus();
            editText.postDelayed(() -> showSoftKeyboard(editText.getContext(),editText),100);
        }
    }
});

public static void showSoftKeyboard(Context context,View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_IMPLICIT);
    }
} 

延迟是因为有时焦点键盘不显示。