2012-02-09 94 views
4

是否有可能一个按钮被点击时的参数传递给听众:调用setOnClickListener时传递参数?

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);   
    } 
}; 

这只是一个例子,而不是什么其实我wan't做了反映,但它确实说明了问题。

基本上我想在myArg传递给所以当按钮被点击它进入myArg变量听众。

我知道我能做到这一点作为一个内联匿名类,但我将有很多按钮和点击逻辑是所有的人都一样。我需要这个参数,因为每个按钮都会有所不同。

仅供参考:我真正的用法要求参数是一个View对象。

+0

当你需要的变量约束?换句话说,你什么时候才能确定你想让'onClickListener()'有权访问的变量的值? – 2012-02-09 14:25:12

回答

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); 
+0

当我看到这个例子时非常明显。我对Java和Android编程相当陌生,并且在Objective-c方面有更多的经验,所以还是让我头脑清醒。谢谢! – Camsoft 2012-02-09 14:37:46

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"); 

会那适合你的目的?