ListView中含有EditText时候--要命的焦点问题迎刃而解
最近做项目的时候遇到了一个问题,就是在ListView的item上面含有一个EditText,要求是这样:
1当点击item的时候,item可以点击;
2当点击EditText的时候EditText也可以正常弹出软件盘;
当时真是把我给搞疯了,item可以点击的时候,EditText不能正常使用了,EditText好了的时候,item又不可点击了,当时那个火,心中一万句草泥马都出来了。言归正传,先看一下解决的效果:
当一个ListView的item中含有抢占焦点的控件的时候,我们通常在item的布局中加上这样一句:
android:descendantFocusability=”blocksDescendants”
防止抢占焦点,大多数情况下都能够解决问题,但是如果是EditText的时候,就很坑了,你会发现软件盘都不能够弹出,更别说输入文字了,要解决这个问题,就是让点击EditText的时候,item最外层不拦截点击事件就ok了,点解item的时候,在拦截点击事件也同样ok了。看getView中关键代码片段:
mHolder.edtInput.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v.getParent())
.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return false;
}
});
这个是EditText的时候的处理
setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
这个很关键,而且是在OnTouchListener中执行的,因为在Android中View的触摸事件传递中,View的OnTouchListener调用是早于其他事件的,而且返回值false,代表目前事件没有被消耗,继续向下传递,不影响后续事件的处理(这里不影响EditText其他事件的处理)
convertView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v)
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Toast.makeText(mContext, "点击了item", Toast.LENGTH_LONG).show();
return false;
}
});
这个是convertView的处理,同样也是一行关键代码
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
下面附上适配器中的代码和布局代码,需要的同学自己copy一下看看吧:
item布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvGroupTitle"
android:layout_width="0dip"
android:layout_height="50dip"
android:layout_weight="1"
android:gravity="center" />
<EditText
android:id="@+id/edtGroupContent"
android:layout_width="100dip"
android:layout_height="wrap_content" />
</LinearLayout>
BaseAdapter的代码:
public class NormalAdapter extends ArrayAdapter<String> {
private List<String> mDatas;
private Context mContext;
public NormalAdapter(Context context, List<String> objects) {
super(context, R.layout.activity_list, objects);
mDatas = objects;
mContext = context;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
Log.e("tag", parent.toString());
Holder mHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_group, null);
mHolder = new Holder();
mHolder.tvTitle = (TextView) convertView
.findViewById(R.id.tvGroupTitle);
mHolder.edtInput = (EditText) convertView
.findViewById(R.id.edtGroupContent);
convertView.setTag(mHolder);
} else {
mHolder = (Holder) convertView.getTag();
}
mHolder.tvTitle.setText(mDatas.get(position));
mHolder.edtInput.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v.getParent())
.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return false;
}
});
convertView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v)
.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
Toast.makeText(mContext, "点击了item", Toast.LENGTH_LONG).show();
return true;
}
});
return convertView;
}
private static final class Holder {
TextView tvTitle;
EditText edtInput;
}
}
看看代码是不是解决问题了,可以的话,就给个赞吧!哈哈-^–^
ListView中含有EditText时候--要命的焦点问题迎刃而解的更多相关文章
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- (转载)解决ListView中使用EditText所遇到的一些冲突
大家都知道在listView中使用editText,在输入过程中是有冲突的.今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下. 首先建立一个最简单的demo,主界面就是一个ListVie ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
- [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法
转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...
- 在ListView中添加EditText丢失光标问题解决
<ListView android:id="@android:id/list" android:layout_height="fill_parent& ...
- android ListView中含有按钮事件实时更新ListView数据案例
1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...
- 【Android】ListView中EditText焦点问题
一.描述: 近期一个项目中需要开发一种类似表格的界面来显示和配置参数,Android并无直接类似表格的控件支持,我采用了ListView中布局EditText和TextView来实现,其中TextVi ...
- android中自定义的dialog中的EditText无法弹出输入法解决方案
1.解决无法弹出输入法: 在show()方法调用之前,用dialog.setView(new EditText(context))添加一个空的EditText,由于是自定义的AlertDialog,有 ...
- ListView 中的TextView实现跑马灯效果
案例:怎么样在一个ListView中含有TextView的item中实现字母滚动呢.这个在一些特定的场合经常用得到.如下图,当焦点位于某个item的时候其内容就自动滚动显示 要实现这样的效果,废话不多 ...
随机推荐
- 扩展KMP(占位)
先放代码. #include<cstdio> #include<iostream> #include<cstring> using namespace std; ; ...
- Streamline Your App with Design Patterns 用设计模式精简你的应用程序
Back to Design Patterns Streamline Your App with Design Patterns 用设计模式精简你的应用程序 In Objective-C progra ...
- Node.js之网游服务器实践
此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 随着Node.js的不断发展与壮大,应用范围也越来越广泛,从传统的企业应用,到互联网使用,再到云计算的发展, ...
- C++语言中的static关键字的作用是什么?
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量.在模块 ...
- VS代码中常用 正则表达式
1. #define ABC 1 修改为 enum 样式: #define (.+?)\s+(.+?)$ $1 = $2 ,
- bzoj 1433: [ZJOI2009]假期的宿舍【匈牙利算法】
i能睡j床的连边(i,j),跑最大匹配或者最大流,然后看看人数能不能对上总数即可 #include<iostream> #include<cstdio> #include< ...
- IDEA打开父类的接口方法快捷键
有两个类,分别为A类是接口.B类为A的实现类. 如果想在B类里的某个方法,打开A类 可以鼠标右键点击这个方法名,按下键盘:Ctrl+U,就可以跳转到A类接口的该方法上面.
- maven在window下的环境变量配置
配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件 首先maven环境变量: 变量名:MAVEN_HOME 变量值:E:\apache-maven-3.2 ...
- spring 通配符
原文地址:http://www.bubuko.com/infodetail-848675.html classpath是指 WEB-INF文件夹下的classes目录(惯例大于配置) classpat ...
- 水题 Codeforces Round #304 (Div. 2) A. Soldier and Bananas
题目传送门 /* 水题:ans = (1+2+3+...+n) * k - n,开long long */ #include <cstdio> #include <algorithm ...