首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android 4.x上按下Listview中的EditText时失去焦点

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

Stack Overflow用户
提问于 2013-12-06 01:18:32
回答 9查看 31.4K关注 0票数 65

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

首次显示软键盘时出现问题。一旦显示,只需再次按editText即可对其进行编辑。

尝试了以下操作:

代码语言:javascript
复制
 android:windowSoftInputMode="adjustPan|adjustResize"

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

代码语言:javascript
复制
 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

这总是会导致ListView包含的第一个visible EditText获得焦点,这是不可取的。第二行中的第二个EditText应该在按下时获得焦点,这是不会发生的。此外,如果我最终成功地将焦点对准了显示的第一个EditText之外的另一个ListView (例如,通过按下softkeyboard上的“下一步”),则在键盘关闭并再次将ListView调整到其完整大小后,第一个可见的and将获得焦点。

我尝试了其他一些事情,比如拦截ListView的onFocusChange()事件,同时知道哪个EditText被它的TouchListener按下了。再次请求该特定EditText的焦点也不会导致任何成功。

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-12-12 12:29:40

对于这种情况,一个典型的技巧就是使用处理程序和postDelayed()。在您的适配器中:

代码语言:javascript
复制
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;
}

这在我的设备上是有效的,但是不要让这段代码投入生产。如果焦点bug在不同的android版本或roms中表现不同,我也不会感到惊讶。

ListView中嵌入EditText还有许多其他问题,它们的解决方案看起来像黑客一样。看看所有的other people正在苦苦挣扎。

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

在我自己走了很多次类似的道路之后,我基本上已经放弃了尝试覆盖任何默认的键盘行为或怪癖。如果可能的话,我建议您尝试在您的应用程序中找到替代解决方案。

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

票数 44
EN

Stack Overflow用户

发布于 2014-06-17 05:41:41

当我按下位于ActionBar行中的EditText时,我遇到了ListView“窃取”焦点的问题。上面的解决方案不起作用,但下面的解决方案对我有效:

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

基本上,我在我的ListView中添加了以下内容:

代码语言:javascript
复制
android:descendantFocusability="beforeDescendants"

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

代码语言:javascript
复制
android:windowSoftInputMode="adjustPan"
票数 40
EN

Stack Overflow用户

发布于 2015-02-16 16:50:49

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

代码语言:javascript
复制
<activity
    android:name=".YourActivity"
    android:windowSoftInputMode="adjustPan">
</activity>
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20406472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档