需求:显示若干行信息,每行都包含 EditText,每个 EditText 都可以输入。
当时的解决办法:ListView + LinearLayout
布局大致情况:ListView 嵌套 LinearLayout, 30个item,每个 Item 包含一个 EditText,也还有其他控件(button, checkbox 等)
遇到的问题:
- 当时清单文件使用的默认配置 (即 android: windowSoftInputMode 没有做任何配置)
点击任意一个 Item 中的 Edittext 之后,软件盘正常弹出,但是很快发现点中的Edittext 并没有获取焦点(即没有光标在闪烁)。根据查阅资料的说法是弹出输入法之后 ListView 进行了重绘导致失去了焦点。此时我没有沿着这条线路继续,而是想到了之前的解决办法,看2。
- 根据查阅的资料,在清单文件中该Activity做如下配置:
<span style="font-size:12px;"> android:windowSoftInputMode = adjustPan
</span>
经过测试发现,焦点和光标问题确实解决了,点击 EditText 弹出软件盘后并不会失去焦点,但是如果想连续输入(输入法不收回,直接下滑),发现最下端的几个Item不能完全显示(滑不上去)。(其实收回软键盘再下滑完全没有问题,但是测试人员就说这是 bug ,没办法还是继续解决呗!)
我试着在 LIstView 下方添加了一个占位 View ,想让 ListView 重绘时留够空间,结果发现无论添加多高的占位 View ,都没有作用。作罢,还是回到方法1。
继续方法1:
首先:
android:windowSoftInputMode = adjustResize
然后在 ListView 适配器的 getView() 方法中,EditText 添加事件
int index = -1;
edittext.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
//在TOUCH的UP事件中,要保存当前的行下标,因为弹出软键盘后,整个画面会被重画
//在getView方法的最后,要根据index和当前的行下标手动为EditText设置焦点
if (event.getAction() == MotionEvent.ACTION_UP) {
index = position;
}
return false;
}
});
if (index != -1 && index == position) {
// 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。 <pre name="code" class="java"> edittext.requestFocus();
//强制将光标移动到最后
<pre name="code" class="java"><pre name="code" class="java"> edittext.setSelection(radio.note.getText().length());
}
以上,即可解决问题。(并非完全原创,结合以下两篇文章,总结了解决问题的过程,防止自己再犯同样的错误)
参考:http://blog.youkuaiyun.com/L_serein/article/details/7517011