首页 文章

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

提问于
浏览
61

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

第一次显示 softkeyboard 时会发生此问题 . 一旦显示,只需按 editText 再次使其可编辑 .

尝试以下方法:

android:windowSoftInputMode="adjustPan|adjustResize"

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

listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

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

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

使用 ScrollView 而不是其他用户建议的 ListView 也不是相关项目的选项 .

9 回答

  • 41

    对于这种情况的经典黑客是使用处理程序和 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;
    }
    

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

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

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

    like this
    .

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

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

  • 1

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

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

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

    android:descendantFocusability="beforeDescendants"
    

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

    android:windowSoftInputMode="adjustPan"
    
  • 0

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

    <activity
        android:name=".YourActivity"
        android:windowSoftInputMode="adjustPan">
    </activity>
    
  • 1

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

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

  • 18

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

  • 39

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

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

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

  • 8

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

    最后,我的案例的问题是 recyclerView 偶然有 wrap_content 作为我的XML高度的值;将其更改为 match_parent 并开始按预期工作,没有设置 focusable 值并使用 android:windowSoftInputMode="adjustResize"

  • 1

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

    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;
                    }
                }
            });
    
  • 0

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

相关问题