单击按钮时是否可以将参数传递给侦听器:
protected void onCreate(Bundle savedInstanceState) {
....
String myArg = "Hello";
Button button1 = (Button)findViewById(R.id.myButton);
button1.setOnClickListener(myListener);
String myArg = "Goodye";
Button button2 = (Button)findViewById(R.id.myOtherButton);
button2.setOnClickListener(myListener);
}
OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// print the value from the passed in argument myArg
Log.v("TEST", myArg);
}
};
这只是一个例子而不是对我实际不想做的事情的反思,但确实说明了这个问题。
基本上我想将myArg传递给监听器,因此当单击该按钮时,它可以访问myArg变量。
我知道我可以将它作为内联匿名类来实现,但是我会有很多按钮,所有这些按钮的点击逻辑都相同。我需要参数,因为每个按钮都会有所不同。
仅供参考:我的实际用法要求参数为View对象。
答案 0 :(得分:6)
我认为解决此类问题的典型方式是测试点击目标的ID:
OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getId()==R.id.myButton) {
//
} elseif (v.getId()==R.id.myOtherButton) {
//
}
}
};
如果这还不够,您可以使用视图的通用标记属性:
Button button1 = (Button)findViewById(R.id.myButton);
button1.setTag("Hello");
button1.setOnClickListener(myListener);
Button button2 = (Button)findViewById(R.id.myOtherButton);
button2.setTag("Goodye");
button2.setOnClickListener(myListener);
...
OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// print the value from the passed in argument myArg
Log.v("TEST", v.getTag());
}
};
最后你甚至可以设置多个标签:
button1.setTag(R.id.arg1, "Hello");
button1.setTag(R.id.arg2, "World");
这是否适合您的目的?
答案 1 :(得分:5)
为什么不创建一个实现View.OnClickListener的类?如果您重复使用每个按钮的代码,这将是理想的。
public class MyListener implements View.OnClickListener
{
private View mView;
public MyListener(View v) {
mView = v;
}
@Override
public void onClick(View v) {
// Use mView here if needed
}
}
然后像平常一样使用它:
OnClickListener listener = new MyListener(myView);