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的
对于相关项目,不能使用其他用户建议的
对于这种情况的经典黑客是使用处理程序和
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时,我遇到了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的这些烦人问题。它不是制作新视图,而是回收和重用旧视图。
我遇到了与
最后,我的案例的问题是
当列表足够长以覆盖软键盘时,
在Android 4.x上按下时,
一种解决方案是将
每当
使用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; } } }); |