解决自定义控件中两个Button设置onClick()发生冲突的方法

来源:互联网 发布:广东粤数大数据 编辑:程序博客网 时间:2024/04/27 03:28
        当我们自定义组合控件时会发现,在布局文件中同时给两个或者两个以上Button同时设置onClick属性,然后设置不同方法去实现的时候会发生错误,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal"     >    <Button         android:id="@+id/bt_sub"        android:onClick="subClicked"        android:background="@drawable/sub"        android:layout_width="50dp"        android:layout_height="50dp"/>    <EditText        android:id="@+id/et_num"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="1" />    <Button         android:id="@+id/bt_add"        android:onClick="addClicked"        android:background="@drawable/add"        android:layout_width="50dp"        android:layout_height="50dp"/></LinearLayout>

其中有连个点击事件,对应的两个方法subClick和addclick,虽然显示布局上不会有问题,但是,当我们调用的时候却会出现问题,
这个时候,有两种解决方案,
方案一、
通过给两个button定义两个id属性,然后在代码中分别给两个button指定点击方法,然后分别执行相应操作:
        private Button bt_sub;private EditText et_num;private Button bt_add;/** * 初始化函数 * @param context */public void initView(Context context){View.inflate(context, R.layout.stepper_item, MyStepper.this);bt_sub = (Button) findViewById(R.id.bt_sub);et_num = (EditText)findViewById(R.id.et_num);bt_add = (Button) findViewById(R.id.bt_add);bt_sub.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO 自动生成的方法存根int num = Integer.parseInt(et_num.getText().toString().trim());num--;if(num<=0){et_num.setText("0");}else{et_num.setText(""+num);}}});bt_add.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO 自动生成的方法存根int num = Integer.parseInt(et_num.getText().toString().trim());num++;et_num.setText(""+num);//et_num.setText(""+Integer.parseInt(et_num.getText().toString().trim()));}});
方案二、让自定义组合控件继承事件监听方法,然后分别设置点击方法:
public class MyStepper extends RelativeLayout implements OnClickListener{private Button bt_sub;private EditText et_num;private Button bt_add;/** * 初始化函数 * @param context */public void initView(Context context){View.inflate(context, R.layout.stepper_item, MyStepper.this);bt_sub = (Button) findViewById(R.id.bt_sub);et_num = (EditText)findViewById(R.id.et_num);bt_add = (Button) findViewById(R.id.bt_add);bt_sub.setOnClickListener(this);bt_add.setOnClickListener(this);}/** * 要设置样式的时候使用 * @param context * @param attrs * @param defStyleAttr */public MyStepper(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO 自动生成的构造函数存根initView(context);}/** * 在布局文件中实例化时使用 * @param context * @param attrs */public MyStepper(Context context, AttributeSet attrs) {super(context, attrs);// TODO 自动生成的构造函数存根initView(context);}/** * 在代码中实例化调用时使用 * @param context * @param attrs */public MyStepper(Context context) {super(context);// TODO 自动生成的构造函数存根initView(context);}/** * 获取数值 * @return */public int getNumber(){return Integer.parseInt(et_num.getText().toString().trim());}@Overridepublic void onClick(View v) {int num = 0;switch(v.getId()){case R.id.bt_add://点击加的按钮num = Integer.parseInt(et_num.getText().toString().trim());num++;et_num.setText(""+num);break;case R.id.bt_sub://点击减按钮num = Integer.parseInt(et_num.getText().toString().trim());num--;if(num<=0){et_num.setText("0");}else{et_num.setText(""+num);}break;}}}


0 0
原创粉丝点击