自定义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
原创粉丝点击