当我们自定义组合控件时会发现,在布局文件中同时给两个或者两个以上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(){
@Override
public 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(){
@Override
public 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());
}
@Override
public 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;
}
}
}