我知道这里有很多类似的问题 但我无法在一个简单的示例应用程序中使用任何提供的解决方案。
第一次显示软键盘时会出现问题。只要显示,只需再次按 editText 即可使其可编辑。
尝试以下方法:
android:windowSoftInputMode="adjustPan|adjustResize"
这不是解决任何问题。在弹出软键盘后,似乎必须使用此行来调整活动的大小。不幸的是,它也导致任何 EditTexts 失去焦点。这可能是 ListView 本身在调整大小过程后获得关注的焦点。所以我尝试了以下解决方法:
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
这始终会导致ListView
包含的第一个可见的EditText 获得焦点,这是不受欢迎的。第二行中的第二个EditText应该在按下时获得焦点,这不会发生。此外,如果我最终设法聚焦另一个EditText,然后显示第一个(例如,通过按softkeyboard
上的'Next'),第一个可见的将在键盘被解除并且ListView被调整为大小后获得焦点它的全尺寸。
我尝试了其他一些事情,例如拦截ListView的onFocusChange()
事件,同时知道TouchListener
按下了哪个EditText。再次请求关注某个EditText并没有带来任何成功。
根据其他用户的建议使用ScrollView
代替ListView
不是相关项目的选项。
答案 0 :(得分: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;
}
这适用于我的设备,但请将此代码停止生产。如果焦点错误在不同的Android版本或roms中表现不同,我也不会感到惊讶。
在EditText
中嵌入ListView
并且有一些感觉像黑客攻击的解决方案还有许多其他问题。查看所有other people挣扎。
这样的事情也很容易发生:
在我自己多次走下类似路径之后,我大多放弃尝试覆盖任何默认的键盘行为或怪癖。如果可能,我建议您尝试在应用中找到替代解决方案。
您是否考虑过将ListView
行设置为样式TextView
,然后在点击一行时显示Dialog
EditText
,并根据需要更新TextView ?
答案 1 :(得分:39)
当我按下ListView行中的EditText时,我遇到了ActionBar“窃取”焦点的问题。上述解决方案不起作用,但以下解决方案对我有用:
http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html
基本上我把它添加到我的ListView:
android:descendantFocusability="beforeDescendants"
并将此添加到我的活动中:
android:windowSoftInputMode="adjustPan"
答案 2 :(得分:18)
修改清单xml,在活动中添加windowSoftInputMode:
<activity
android:name=".YourActivity"
android:windowSoftInputMode="adjustPan">
</activity>
答案 3 :(得分:8)
我知道这是一个非常老的帖子,但这个答案可能对某人有帮助,所以在这里:
切换到 RecyclerView ,您不必担心这些恼人的ListView问题。它不是制作新视图,而是回收和重用旧视图。
答案 4 :(得分:1)
使用recycleler View,这解决了list和gridview中的几个问题。哟甚至可以使用交错的网格视图。 Yo可以很容易地开始使用这个http://android-er.blogspot.com.co/2015/07/staggeredgridlayoutmanager-google-app.html
答案 5 :(得分:1)
当列表足够长以覆盖软键盘时,
在Android 4.x上按下时,EditText
中的Listview
会失去焦点。
一种解决方案是将Listview
包裹在线性布局中,高度为屏幕的一半。
每当Listview
没有覆盖软键盘时,一切都很好。
答案 6 :(得分:1)
我遇到与recyclerView
相同的问题并尝试了所有建议的解决方案。
最后,我的案例的问题是recyclerView
偶然有wrap_content
作为我的XML高度的值;已将其更改为match_parent
并开始按预期工作,未设置focusable
值并使用android:windowSoftInputMode="adjustResize"
答案 7 :(得分:0)
在我的情况下,我在我的适配器中添加了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;
}
}
});
答案 8 :(得分:0)
遇到了同样的问题。使用inputMode,focusability等搜索所有此类解决方案。最佳解决方案,迁移到回收站视图。