在安卓开发的过程当中,遇到了listview遇见item中有edittext嵌套的问题,刚开始讨论的时候感受这还不是很简单的事,实际操做中遇到了各式各样的问题ide
点击EditText弹出软键盘致使EditText焦点丢失和文本重置问题
问题描述:点击EditText,弹出软键盘,会致使ListView调用getView()重绘,从而致使原本应该在EditText上的焦点被刷新而消失了,从而在软键盘上输入任何文字都没有显示没有效果,必须再点击一次EditText才会有焦点,而且不管输入什么内容隐藏软键盘后再次因为重绘又变回原来的文本内容。this
解决方案spa
定义一个整型变量来标志点击的是哪一个EditText:.net
private int index = -1; 事件
在getView中为EditText添加onTouch事件:开发
- rightEt.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_UP) {
- index = position;
- }
- return false;
- }
- });
在getView()的结尾处判断当前绘制的Item的position是否是刚才点击的那个EditText:get
- rightEt.clearFocus();
- if(index != -1 && index == position){
- //强制加上焦点
- rightEt.requestFocus();
- //设置光标显示到编辑框尾部
- rightEt.setSelection(rightEt .getText().length());
- //重置
- index = -1;
- }
思路:点击某个Item里的EditText,将该Item的position赋给index,弹出软键盘以后,ListView所有从新绘制,每次调用getView时都进行判断当前绘制的Item是不是点击的那个EditText所在的Item,若是是,则将该EditText对焦,并设置光标显示于文本尾部。it
解决了焦点问题,还须要解决EditText文本被从新绘制问题:io
为EditText设置OnFocusChangeListener事件:event
- rightEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if(!hasFocus){
- datas.get(position).setStrRightTv(rightEt.getText().toString());
- }
- }
- });
思路:一旦失去了焦点,就用此时的EditText上的文本内容去更新数据源。
ListView与EditText多行文本时的滑动冲突问题
问题描述:当EditText嵌套在ListView中且EditText设置是多行文本时,EditText自己内容本应该自带滚动效果,但当点击EditText内部滑动的时候,发现失效,这是因为外层的ListView拦截了它的子控件EditText的事件致使的。
解决方案
- mEditText.setOnTouchListener(this);
-
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (v.getId()) {
- case R.id.edit_text:
- v.getParent().requestDisallowInterceptTouchEvent(true);
- switch (event.getAction()) {
- case MotionEvent.ACTION_UP:
- v.getParent().requestDisallowInterceptTouchEvent(false);
- break;
- }
- }
- return false;
- }