用Tag区分Click事件(为动态生成的页面添加onClick事件)

Android开发中,经常用到Button控件,关于Button的Click事件的响应,有很多种方法,简单地说,可以归为两种,一种是在xml文件的Button标签中,添加android:onClick属性,另一种则是在代码中,通过Button的setOnClickListener方法来提供回调。本文探讨的是,当一个页面中含有多个Button的时候,如何更好地为这些Button提供click事件监听。

先说说在xml定义Button的Click事件监听的方法,示例如下:

XML中,为Button添加onClick属性:

<Button
    android:id="@+id/ButtonA"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ButtonA"
    android:onClick="onClickButtonA"/>

相应的Activity中,添加一个方法即可:

public void onClickButtonA(View view) {
}

这种方法只适合通过setContentView加载XML文件绘制界面的场合,如果通过代码动态创建视图,或者动态添加Button,则必须通过Button的 setOnClickListener 来添加响应代码了。

首先,创建 OnClickListener 的派生类:

public class onClickButtonListener implements OnClickListener {
    @Override
    public void onClick(View v) {
    }
}

然后,找出 Button 对象,添加该 onClickButtonListener 对象:

Button buttonA = (Button)findViewById(R.id.ButtonB);
buttonA.setOnClickListener(new onClickButtonListener());

这样,即为该Button 添加了一个响应事件的类对象,当Click该Button后, onClickButtonListener 的 onClick 事件就会被调用。

那么,如果 XML 文件中有多个Button,比如ButtonA,ButtonB,ButtonC,该如何在 onClickButtonListener中区分响应呢?

这里提供三种思路:

(1) 为每一个Button派生一个OnClickListener子类

public class onClickButtonAListener implements OnClickListener
public class onClickButtonBListener implements OnClickListener
public class onClickButtonCListener implements OnClickListener

然后,分别set到各个Button中:

buttonA.setOnClickListener(new onClickButtonAListener());
buttonB.setOnClickListener(new onClickButtonBListener());
buttonC.setOnClickListener(new onClickButtonCListener());

(2) 为 onClickButtonListener 添加一个标识类型的成员变量

public class onClickButtonListener implements OnClickListener {
                                                                                                    
        public static final int BUTTON_TYPE_A = 0;
        public static final int BUTTON_TYPE_B = 1;
        public static final int BUTTON_TYPE_C = 2;
                                                                                                            
        private final int mType;
                                                                                                            
        public onClickButtonListener( int type ) {
            mType = type;
        }
                                                                                                            
        @Override
        public void onClick(View v) {
            switch(mType) {
            case BUTTON_TYPE_A:
                 break;
            case BUTTON_TYPE_B:
                 break;
            case BUTTON_TYPE_C:
                 break;
            }
        }      
}

然后,newonClickButtonListener的时候,填入 type

buttonA.setOnClickListener(new
        onClickButtonListener(onClickButtonListener.BUTTON_TYPE_A));
buttonB.setOnClickListener(new
        onClickButtonListener(onClickButtonListener.BUTTON_TYPE_B));
buttonC.setOnClickListener(new
        onClickButtonListener(onClickButtonListener.BUTTON_TYPE_C));

(3)使用 Button 的 setTag 方法

public class Tag {
                                                                              
        public static final int BUTTON_TYPE_A = 0;
        public static final int BUTTON_TYPE_B = 1;
        public static final int BUTTON_TYPE_C = 2;
                                                                                  
        public final int mType;
                                                                              
        public Tag(int type) {
            mType = type;
        }
}
                                                                    
public class onClickButtonListener implements OnClickListener {
        @Override
        public void onClick(View v) {
                                                                                  
            Tag type = (Tag)v.getTag();
                                                                                  
            switch(type.mType) {
            case Tag.BUTTON_TYPE_A:
                 break;
            case Tag.BUTTON_TYPE_B:
                 break;
            case Tag.BUTTON_TYPE_C:
                 break;
            }
        }      
}

然后,在  new onClickButtonListener的时候,填入Tag对象:

buttonA.setTag(new Tag(Tag.BUTTON_TYPE_A));
buttonA.setOnClickListener(new onClickButtonListener());
                                                                   
buttonB.setTag(new Tag(Tag.BUTTON_TYPE_B));
buttonB.setOnClickListener(new onClickButtonListener());
                                                                   
buttonC.setTag(new Tag(Tag.BUTTON_TYPE_C));
buttonC.setOnClickListener(new onClickButtonListener());

注意,第三种方法在本应用中看起来貌似没有第二种方法方便,但是在许多复杂的应用中,第三种方法还是用得蛮多的,因为毕竟Tag是一个自定义的类,是可以容纳很多信息的,而第二种方法中,传递给 onClickButtonListener构造函数的参数,毕竟有限。

Tag的使用 package com.yarin.android.qiehuan; import android.app.AlertDialog; import android.app.Dialog; import android.app.TabActivity; import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; public class Activity01 extends TabActivity { //声明TabHost对象 TabHost mTabHost; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得TabHost对象 mTabHost = getTabHost(); /* 为TabHost添加标签 */ //新建一个newTabSpec(newTabSpec) //设置其标签和图标(setIndicator) //设置内容(setContent) mTabHost.addTab(mTabHost.newTabSpec("test1") .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1)) .setContent(R.id.textview1)); mTabHost.addTab(mTabHost.newTabSpec("test2") .setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2)) .setContent(R.id.textview2)); mTabHost.addTab(mTabHost.newTabSpec("test3") .setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3)) .setContent(R.id.textview3)); //设置TabHost的背景颜色 mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150)); //设置TabHost的背景图片资源 //mTabHost.setBackgroundResource(R.drawable.bg0); //设置当前显示哪一个标签 mTabHost.setCurrentTab(0); //标签切换事件处理,setOnTabChangedListener mTabHost.setOnTabChangedListener(new OnTabChangeListener() { // TODO Auto-generated method stub @Override public void onTabChanged(String tabId) { Dialog dialog = new AlertDialog.Builder(Activity01.this) .setTitle("善谢谢提醒") .setMessage("现在选中了:"+tabId+"标签") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }).create();//创建按钮 dialog.show(); } }); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值