当键盘弹出时,ListActivity中的ListView编辑文本会失去焦点

26

我已经搜索了很多关于这个问题的答案,但看起来所有的答案都无法解决我的问题,所以我想询问一下。

我在一个 ListActivity 中添加了几个 EditText 框,并将其放到一个基于 ListView 的视图中。当我将 windowSoftInputMode 设置为 adjustPan 时,当我点击一个 EditText 框时,它可以正常工作,但是当我再次点击它时,键盘会覆盖住它。当我将 windowSoftInputMode 设置为 adjustResize 时,当键盘弹出时,EditText 框会失去焦点,我必须再次点击它才能输入。

我尝试找到如何捕获 onResize 事件,但好像它与视图相关联而不是活动,而我也不确定如何监听它。我还尝试了一些其他帖子中提到的对 EditText 框和 ListView 本身的可聚焦设置,但似乎也没有什么帮助。


能否展示一下它的屏幕截图?同时提供一些代码会更有帮助。 - Wolfcow
7个回答

65

您只需要将此应用于您的 ListView:

XML:

android:descendantFocusability="afterDescendants"

Java:

listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

哦,我的天啊,谢谢你!今天这个问题重新变成了一个更大的问题,所以我刚看到这个答案,它似乎有效! - Physibeth
7
这个解决方案大部分情况下是可行的。问题在于当SIP弹出时,第一个可聚焦的编辑框总是会被选中。如果我要选择的编辑框不是第一个可聚焦的编辑框,则会出现问题。我仍在努力解决如何解决这个问题,这让我陷入了类似之前的困境。是否有办法将视图的焦点顺序设置为首选项,即使它在布局中并不是第一个? - Physibeth
2
我不知道为什么其他所有的SO答案都推荐使用beforeDescendantsafterDescendants是唯一一个对我有用的,而且在文档方面也非常合理。 - Dany Joumaa
非常感谢,让我想知道为什么Android不会自动执行此操作或在Studio中提供相应的提示。此问题相当普遍,但并未引起足够的关注。 - Abhishek Mathur
@AbhishekMathur工作室不知道这个视图在ListView / RecyclerView中使用。 - Bojan Kseneman

2

RecyclerView 是最好的选择,无需在任何其他地方混淆其它属性。


我同意。我尝试了所有方法来修复ListViewEditText的行为,但是没有任何效果。我转而使用RecyclerView(请参见https://developer.android.com/guide/topics/ui/layout/recyclerview),现在一切都像梦一样顺畅,没有任何恶心的技巧。而且,由于我已经在我的`ListView`适配器中使用了`ViewHolder`模型,所以迁移非常容易。 - drmrbrewer

2
在我的情况下,通过将以下代码添加到清单中,它完美地工作了:
android:windowSoftInputMode="adjustPan"

2

对于我来说,以下组合帮助了我(特别是第三个):

1)将以下内容添加到清单文件中相关的活动中,这是必需的,以便您的ListView可以调整大小,只填充软键盘上方的区域:

android:windowSoftInputMode="adjustResize"

2) 如果ListView的任何子元素需要焦点,那么下面的代码将使ListView不会获取到焦点。子元素(例如EditText)需要获取并保持焦点。

<ListView
...
android:descendantFocusability="afterDescendants"/>

3)自动显示/隐藏拼写建议条就在键盘上方,这会触发ListView刷新。为了解决这个问题,我关闭了ListView中任何EditText的建议功能。

<EditText
...
android:inputType="textNoSuggestions|textVisiblePassword" />

0

在使用adjustResize后,您是否尝试过确保通过执行类似于EditText.requestFocus();的操作将焦点重新设置到EditText上,以便它再次获得焦点,用户不必再次点击它。您还可以使用EditText.isFocused()在调试日志语句或其他地方查看它是否聚焦(true)或未聚焦(false)。

您可能还需要使用SetFocusable()将字段设置为focusable,但要小心,因为这可能会从ListView本身中取走焦点,并防止您稍后滚动或选择内容,因此您需要尝试一下设置可聚焦和聚焦状态的内容。


我正在尝试捕获onResize事件,但由于它与视图而不是活动相关联,我不太确定该如何做。我尝试了很多从其他类似问题中得到的设置焦点的不同变体,但似乎都没有帮助。 - Physibeth
也许不调整键盘大小,而是将您的EditText移动到键盘上方会更好?您需要文本框在当前位置的特定原因吗? - BarFoo
1
是的,那就是指定的设计。 - Physibeth

0

我在我的项目中遇到了完全相同的问题。

为了解决这个问题,我创建了一个子类EditText并处理了"Back"按钮按下事件-以确保在那个时刻我的EditText清除焦点。

请参阅此解决方案,了解如何执行此操作。

祝你好运。


0
mViewHolder.editText = (EditText)convertView.findViewById(R.id.editText1);
            mViewHolder.editText.setTag(position);
            mViewHolder.editText.setTextColor(0xFF000000);
            mViewHolder.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {
                        EditText et =(EditText)v.findViewById(R.id.editText1);
                        editTextArrayList.set(position,et.getText().toString().trim());
                    }
                }
            });

你好,以下链接可能对你有所帮助 http://mylearnandroid.blogspot.in/2014/06/listview-problem-while-scrolling.html


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