自定义LinearLayout 添加click事件
来源:互联网 发布:c语言编程案例 编辑:程序博客网 时间:2024/05/16 08:22
最近写项目,遇到一个恶心问题,我自定义了一个LinearLayout 控件,上面含有2个TextView,可是添加click事件后,却不响应了。而直接给LinearLayout添加事件,却能响应。
代码如下:
这样的LinearLayout 是能响应事件的
<LinearLayout android:id="@+id/layoutLinear1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/layou_selector" android:clickable="true" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>
<com.example.clicklinearlayout.MLayout android:layout_width="match_parent" android:id="@+id/layoutM1" android:clickable="true" android:layout_height="wrap_content" > </com.example.clicklinearlayout.MLayout>
public class MLayout extends LinearLayout {public MLayout(Context context) {this(context, null);}public MLayout(Context context, AttributeSet attrs) {super(context, attrs);inflate(context, R.layout.layout_m, this);}
布局文件
<LinearLayout android:layout_width="match_parent" android:background="@drawable/layou_selector" android:layout_height="wrap_content" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/summry" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>
用eclipse 分析布局,对比发现,两种方式的表现效果是一样的,但是实际的布局层次不一样:
可以看到 自定义的MLayout的布局比预想的外面多套了一层LinearLayout,而我们的事件,就是加在外层LinearLayout的,而里层的LinearLayout 可以获取事件,故被里层的消耗掉了,外层的LinearLayout,故此不会响应添加的事件。也及,添加了click事件的外层LinearLayout,获取不到click事件,而能获取click事件的内层LinearLayout却未添加响应事件。真心坑爹,当然也是自己的基本功欠缺。
用嵌套的LinearLayout实现如上UI效果后,事件的效果也如同上面:
事件加在外层,不响应点击事件
<LinearLayout android:id="@+id/layoutLinear2" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/layou_selector" android:clickable="true" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </LinearLayout>
解决方案:
由于自定义控件 inflate的布局文件 layout_m 是以子view的方式add到 extends 的LinearLayout上的,所以可以采用如下两种方式解决:
1,对外层LinearLayout的事件,进行转发,转发都内层LinearLayout上:
public class MLayout extends LinearLayout {View layout=null;public MLayout(Context context) {this(context, null);}public MLayout(Context context, AttributeSet attrs) {super(context, attrs);inflate(context, R.layout.layout_m, this);layout=findViewById(R.id.layout);}@Overridepublic void setOnClickListener(OnClickListener l) {//将click事件分发到内层viewlayout.setOnClickListener(l);}}
2.由于我的本质目的是想自定义的LinearLayout 下直接是那两个TextView,故可以采用如下布局方式,减少嵌套层次:
<merge xmlns:android="http://schemas.android.com/apk/res/android" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/summry" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /></merge>
直接把这2个TextView挂到 extends的LinearLayout上
0 0
- 自定义LinearLayout 添加click事件
- 添加click事件
- EChars添加click事件
- 添加click事件
- ichart添加click事件
- AngularJS 添加Click事件
- Linearlayout添加监听事件
- 如何为click事件添加beforclick事件
- LinearLayout 点击事件 添加点击事件代码
- QT为QLabel添加Click事件
- ExtJS中给Label添加click事件
- QT为QLabel添加Click事件
- jquery 添加标签不响应click事件
- 为iframe中的body添加click事件
- jQuery 用each() 添加click事件
- 为每个按钮添加Click事件
- [JQuery]随心所欲添加删除按钮Click事件
- QT为QLabel添加Click事件
- C/C++连接MYSQL数据库
- 线程学习2--ThreadLocal
- Github上最受关注的前端大牛,快来膜拜吧!
- linux vim编辑器如何取消点亮字符串
- Qemu快照(snapshot)机制原理及关键技术理解
- 自定义LinearLayout 添加click事件
- C语言计算程序持续时间
- 数字证书原理,公钥私钥加密原理
- POJ3468__A Simple Problem with Integers (线段树)
- 查看mysql版本的四种方法
- C语言编译全过程介绍
- spark上的scala学习笔记
- 网络编程浅析(一)
- 让python代码运行的更快