调用setOnClickListener时传递参数?

Cam*_*oft 4 java android onclick button

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

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);           
    }
};
Run Code Online (Sandbox Code Playgroud)

这只是一个例子而不是对我实际不想做的事情的反思,但它确实说明了这个问题.

基本上我想将myArg传递给监听器,因此当单击该按钮时,它可以访问myArg变量.

我知道我可以将它作为一个内联匿名类来实现,但是我会有很多按钮,所有这些按钮的点击逻辑都是相同的.我需要参数,因为每个按钮都会有所不同.

仅供参考:我的实际用法要求参数为View对象.

Phi*_*ons 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) {
             //
        }       
    }
};
Run Code Online (Sandbox Code Playgroud)

如果这不够,您可以使用视图的通用标记属性:

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());           
   }
};
Run Code Online (Sandbox Code Playgroud)

最后你甚至可以设置多个标签:

 button1.setTag(R.id.arg1, "Hello");
 button1.setTag(R.id.arg2, "World");
Run Code Online (Sandbox Code Playgroud)

这适合你的目的吗?


oni*_*nit 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             
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像平常一样使用它:

OnClickListener listener = new MyListener(myView);
Run Code Online (Sandbox Code Playgroud)