问题描述
我正在制作一个聊天应用程序,并希望在聊天窗口可见时保持软键盘打开。当用户点击同一页面上的任何其他控件时,键盘不应隐藏。我的视图层次结构如下所示:
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);
}
}
延迟是因为有时焦点键盘不显示。