Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:防止聊天窗口中的软键盘关闭_Android_Android Recyclerview_Android Edittext_Chat_Android Softkeyboard - Fatal编程技术网

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

Android:防止聊天窗口中的软键盘关闭,android,android-recyclerview,android-edittext,chat,android-softkeyboard,Android,Android Recyclerview,Android Edittext,Chat,Android Softkeyboard,我正在制作聊天应用程序,希望在聊天窗口可见时保持软键盘打开。当用户点击同一页面上的任何其他控件时,键盘不应隐藏。我的视图层次结构如下所示: LinearLayout RecyclerView LinearLayout 子线性布局有一个EditText和一个发送消息的按钮。显示页面后,我请求将焦点放在编辑文本上,并使用SHOW\u FORCED标志显示软输入。问题是当我点击RecyclerView或send按钮时,如果编辑文本具有焦点,则键盘将隐藏 是否可以确保编辑文本不会失去焦点(

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

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


是否可以确保编辑文本不会失去焦点(从而防止键盘消失)?我可以在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.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);
    }
} 

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

这是否回答了您的问题?不,没有。正如我在回答中提到的,我有一个自定义按钮来发送消息。我没有通过键盘上的“完成”按钮发送消息。用户必须手动点击按钮才能发送消息
SHOW_FORCED
对我不起作用。能否确认此行为是否可在模拟器上重现?能否共享EditText、Button和清单文件中的XML代码?在给定场景中,键盘默认为打开状态。那么,你能分享一下你的布局吗?还有你在发送按钮上的操作吗?我不需要焦点。当聊天窗口打开时,我需要软键盘永远不会消失。现在,当我点击一个按钮发送信息时,键盘消失了。我必须再次点击编辑文本才能显示键盘。你能分享你的代码吗?我可以更好地帮助你。不幸的是,这不起作用。这种实现的结果是,当我单击“发送”按钮并再次显示“编辑文本”时,当“编辑文本”失去焦点时,键盘关闭。我根本不想让键盘关上。