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

3

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

LinearLayout
   RecyclerView
   LinearLayout

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

是否有可能确保编辑文本永远不失去焦点(从而防止键盘消失)? 我能够轻松地在iOS上实现这一点,但在Android上却遇到了困难。


这个回答解决了你的问题吗?Android 防止键盘关闭 - unzila
不,它不会。正如我在答案中提到的那样,我有一个自定义按钮来发送消息。我不是通过键盘的“完成”按钮发送消息。用户必须手动点击按钮才能发送消息。“SHOW_FORCED”对我没有用。 - user246392
请问您能否确认在模拟器上是否可以重现这种行为? - rahul.taicho
请问您能否分享EditText、Button的XML代码以及manifest文件中的<activity>代码? - Vijay
在给定的情况下,键盘默认保持打开状态。所以你能分享一下你的布局以及在发送按钮点击时你正在做什么吗? - Mayur Gajra
@user246392 你是在使用键盘的 "发送" 操作吗? - Imtiyaz Khalani
3个回答

0

你可以在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);
    }
} 

延迟是因为有时候焦点键盘没有显示出来。


不幸的是,这个方法不起作用。这个实现的问题在于当我点击发送按钮并且编辑文本失去焦点时,键盘会关闭并再次出现。我根本不想让键盘关闭。 - user246392

0
如果你想让 editText 保持焦点不丢失,可以使用以下代码,这对我很有效:

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

我不仅需要焦点,还需要在聊天窗口打开时软键盘永远不会消失。目前,当我点击发送消息的按钮时,键盘会消失。我必须再次点击EditText以显示键盘。 - user246392
你能分享一下你的代码吗?这样我就可以更好地帮助你了。 - Waqas Yousaf

0

请记住,由于复杂性,我还没有尝试构建这个。如果我有时间,我会尝试添加一个示例。

我猜你想要构建类似于WhatsApp的东西。在我看来,最有前途的方法是在根LinearLayout中设置全局touchListener,它消耗所有触摸事件,同时使子项无法聚焦,因此允许您手动处理所有触摸事件。如果检测到滑动触摸,请相应地滚动RecyclerView。如果在EditText区域检测到触摸,则设置焦点并打开键盘。这样,触摸不会改变焦点状态,保持键盘打开。请记住,您可能需要处理所有其他触摸情况。首先创建监听器,并使除第一个布局以外的所有内容在触摸时无法聚焦,然后构建您的特定交互。


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