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

Dis*_*ame 63 android ontouchlistener android-softkeyboard android-listview android-edittext

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

第一次显示软键盘时会出现问题.显示后,只需再次按editText即可进行编辑.

尝试以下方法:

 android:windowSoftInputMode="adjustPan|adjustResize"
Run Code Online (Sandbox Code Playgroud)

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

 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Run Code Online (Sandbox Code Playgroud)

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

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

对于相关项目,使用a ScrollView而不是ListView其他用户建议的选项不是一种选择.

Kyl*_*vey 42

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

嵌入一​​个具有感觉像黑客的解决方案的EditText内部还存在许多其他问题ListView.看到所有其他 在苦苦挣扎.

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

像这样.

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

您是否考虑过将ListView行设置为样式TextView,然后在单击行时显示a Dialog,EditText根据需要更新TextView?

  • @GrafOrlov你可能不想在生产中使用这个解决方案.单击一行时,请考虑在对话框中显示edittext. (2认同)

gon*_*ins 39

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

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

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

android:descendantFocusability="beforeDescendants"
Run Code Online (Sandbox Code Playgroud)

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

android:windowSoftInputMode="adjustPan"
Run Code Online (Sandbox Code Playgroud)

  • 这将导致键盘阻止EditText,如果它在列表的底部 (7认同)

nlm*_*m01 19

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

<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="adjustPan">
</activity>
Run Code Online (Sandbox Code Playgroud)


Sha*_*n91 8

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

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

  • 这是恕我直言的最佳选择.其他解决方案只是解决方法.它们不会改变ListView在`notifyDataSetChanged`期间创建/销毁视图的事实.使用RecyclerView,您可以通知各个插入,更新和删除.焦点视图没有重新创建,因此没有焦点问题. (2认同)
  • 也在回收者视图中发生 (2认同)