在ListView中的EditText在Android 4.x上按下时失去焦点
我知道这里有很多类似的问题,但是我不能在简单的示例应用程序中获得任何提供的解决scheme。
第一次显示软键盘时会出现问题。 一旦显示,只需再次按editText使其可编辑。
试过以下几点:
android:windowSoftInputMode="adjustPan|adjustResize"
这不是解决任何问题。 似乎这个行是强制性的软键盘popup后,调整活动。 不幸的是,这也导致任何EditTexts失去焦点。 这可能是ListView本身在resize过程之后获得焦点。 所以我尝试了以下解决方法:
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
这总是会导致ListView
包含的第一个可见的EditText获得焦点,这是不可取的。 第二行中的第二个EditText应该在按下时获得焦点,这不会发生。 另外,如果我最终设法聚焦另一个EditText,然后显示第一个EditText(例如,通过按下softkeyboard
键盘上的“Next”),第一个可见的将在键盘被解散并且ListView被重新调整到其全尺寸。
我尝试了几个其他的东西,例如拦截ListView的onFocusChange()
事件,同时知道TouchListener
按下了哪个EditText。 再次请求某个EditText的焦点也没有导致任何成功。
使用ScrollView
而不是其他用户build议的ListView
而不是相关项目的选项。
对于这种情况的一个典型的破解是使用一个处理程序和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版本或者ROM中显示不同,我也不会感到惊讶。
在一个ListView
中embedded一个EditText
也有很多其他问题,这些问题的解决scheme就像一个黑客攻击。 看到所有其他 人在挣扎。
发生这样的事情也很容易:
。
在经历了多次类似的path之后,我已经放弃尝试覆盖任何默认的键盘行为或怪癖。 如果可能的话,我会build议您在应用程序中寻找替代解决scheme。
你有没有考虑过ListView
行只是一个样式的TextView
,然后显示一个EditText
Dialog
,单击一行时,根据需要更新TextView?
当我按下位于ListView行内的EditText时,我遇到了ActionBar“偷窃”焦点的问题。 上述解决scheme不起作用,但下面的解决scheme为我工作:
http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html
基本上我把这个添加到我的ListView:
android:descendantFocusability="beforeDescendants"
并将其添加到我的活动中:
android:windowSoftInputMode="adjustPan"
修改您的清单xml以在您的活动中添加windowSoftInputMode:
<activity android:name=".YourActivity" android:windowSoftInputMode="adjustPan"> </activity>
我知道它是一个非常古老的线程,但这个答案可能对某人有所帮助,所以这里是:
切换到RecyclerView ,你将不必担心这些恼人的问题的ListView。 它不是以新的视angular来回收和重复使用旧的观点。
使用回收站查看,这从列表和gridview解决了几个问题。 哟,甚至可以用交错gridviews工作。 呦可以很容易地开始工作这个http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html
当列表足够长以覆盖软键盘时, Listview
的EditText
在Android 4.x上按下时失去焦点。
一种解决scheme是将Listview
以高度为屏幕一半的线性布局封装。
每当列表视图不覆盖软键盘,一切都很好。
在我的情况下,我在我的适配器中添加了本地值currentlyFocusedRow。 在方法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; } } });
有同样的问题。 通过inputMode,focusability等search所有这些解决scheme。 最好的解决scheme,迁移到回收站视图。
我与recyclerView
有同样的问题,并尝试所有build议的解决scheme。
最后,我的案例的问题是, recyclerView
有错误wrap_content
作为我的XML的高度值; 将其更改为match_parent
并开始按预期工作,没有focusable
android:windowSoftInputMode="adjustResize"
值集和使用android:windowSoftInputMode="adjustResize"