调用setOnClickListener时传递参数?

时间:2012-02-09 14:18:37

标签: java android button onclick

单击按钮时是否可以将参数传递给侦听器:

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对象。

2 个答案:

答案 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);