Listview中的EditText在Android 4.x上按下时失去焦点

EditText in Listview loses focus when pressed on Android 4.x

我知道这里有很多类似的问题
但我无法在一个简单的示例应用程序中获得任何提供的解决方案。

第一次显示软键盘时会出现问题。一旦显示,只需再次按editText即可使其可编辑。

尝试以下方法:

1
 android:windowSoftInputMode="adjustPan|adjustResize"

这不是解决任何问题。在弹出软键盘后,似乎必须使用此行来调整活动的大小。不幸的是,它也导致任何EditTexts失去焦点。这可能是ListView本身在调整大小过程后获得关注的焦点。所以我尝试了以下解决方法:

1
 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

这总是导致ListView包含的第一个可见的EditText获得焦点,这是不合需要的。第二行中的第二个EditText应该在按下时获得焦点,这不会发生。此外,如果我最终设法聚焦另一个EditText,然后显示第一个(例如,通过按softkeyboard上的'Next'),第一个可见的将在键盘被解除并且ListView被调整为完整后获得焦点再次大小。

我尝试了其他一些事情,例如拦截ListView的onFocusChange()事件,同时知道哪个EditText被其TouchListener按下。再次请求关注某个EditText也没有取得任何成功。

对于相关项目,不能使用其他用户建议的ScrollView而不是ListView


对于这种情况的经典黑客是使用处理程序和postDelayed()。在您的适配器中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private int lastFocussedPosition = -1;
private Handler handler = new Handler();

public View getView(final int position, View convertView, ViewGroup parent) {

    // ...

    edittext.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                handler.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        if (lastFocussedPosition == -1 || lastFocussedPosition == position) {
                            lastFocussedPosition = position;
                            edittext.requestFocus();
                        }
                    }
                }, 200);

            } else {
                lastFocussedPosition = -1;
            }
        }
    });

    return convertView;
}

这适用于我的设备,但保持此代码不在生产中。如果焦点错误在不同的Android版本或roms中表现不同,我也不会感到惊讶。

ListView中嵌入EditText还有许多其他问题,这些问题的解决方案感觉像是黑客攻击。看到所有其他人在苦苦挣扎。

这样的事情也很容易发生:

like this

在我自己多次走下类似路径之后,我大多放弃尝试覆盖任何默认的键盘行为或怪癖。如果可能,我建议您尝试在应用中寻找替代解决方案。

您是否考虑过将ListView行设为样式TextView,然后在单击行时显示带有EditTextDialog,并根据需要更新TextView?


当我按下ListView行中的EditText时,我遇到了ActionBar"偷"焦点的问题。上述解决方案不起作用,但以下解决方案对我有用:

http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html

基本上我把它添加到我的ListView:

1
android:descendantFocusability="beforeDescendants"

并将此添加到我的活动中:

1
android:windowSoftInputMode="adjustPan"


修改清单xml以在活动中添加windowSoftInputMode:

1
2
3
4
<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="adjustPan">
</activity>

我知道它是一个非常古老的线程,但这个答案可能对某人有帮助,所以这里是:

切换到RecyclerView,您不必担心ListView的这些烦人问题。它不是制作新视图,而是回收和重用旧视图。


我遇到了与recyclerView相同的问题并尝试了所有建议的解决方案。

最后,我的案例的问题是recyclerViewwrap_content作为我的XML上的高度的意外值;将其更改为match_parent并按预期开始工作,未设置focusable值并使用android:windowSoftInputMode="adjustResize"


当列表足够长以覆盖软键盘时,
在Android 4.x上按下时,ListView中的EditText会失去焦点。

一种解决方案是将ListView包裹在线性布局中,高度为屏幕的一半。

每当ListView没有覆盖软键盘时,一切都很好。


使用recycleler View,这解决了list和gridview中的几个问题。哟甚至可以使用交错的网格视图。你可以很容易地开始使用这个http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html


有同样的问题。使用inputMode,focusability等搜索所有此类解决方案。最佳解决方案,迁移到回收站视图。


在我的情况下,我在我的适配器中添加了localFocusedRow的本地值。
在getView()方法中,我将这些代码添加到每个editText中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   if (currentlyFocusedRow == position) {
        editText.requestFocus();
   }

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    if (currentlyFocusedRow == -1) {
                        currentlyFocusedRow = position;
                    }
                } else {
                    currentlyFocusedRow = -1;
                }
            }
        });