如何将parameter passing给OnClickListener?

我如何将parameter passing给OnClickListener()?

有我的听众:

OnClickListener myListener = new OnClickListener() { @Override public void onClick(View v) { //I want to reach params here } }; 

我得到了12个button,我不想为他们写12个听众,只是给他们传递一个string,他们完全可以做不同的事情。

使用您自己的自定义OnClickListener

 public class MyLovelyOnClickListener implements OnClickListener { int myLovelyVariable; public MyLovelyOnClickListener(int myLovelyVariable) { this.myLovelyVariable = myLovelyVariable; } @Override public void onClick(View v) { //read your lovely variable } }; 

对于这个问题的另一个解决scheme,你可以创build一个常规的方法,并传递给你要添加onClickListenerView ,并传递你想要使用的参数

 Button b1 = new Button(); String something = "something"; Button b2 = new Button(); String anotherSomething = "anotherSomething"; setOnClick(b1, something); setOnClick(b2, anotherSomething); private void setOnClick(final Button btn, final String str){ btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Do whatever you want(str can be used here) } }); } 
  1. 让你的活动实现View.OnClickListener
  2. 将您的button注册到侦听器
  3. 检查onClick中点击哪个button
  4. 处理您的string取决于哪个button被点击

     public class _Test2Activity extends Activity implements OnClickListener { private Button button1; private Button button2; private Button button3; private String myString; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button1 = (Button)findViewById(R.id.button1); button2 = (Button)findViewById(R.id.button2); button3 = (Button)findViewById(R.id.button3); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); myString = "This is a string"; } @Override public void onClick(View v) { if(v==button1) { //do something with myString } else if(v==button2) { //do something with myString } else if (v==button3) { //do something with myString } } } 

我知道这是一个迟到的答案,但希望它可以帮助某人。 现有的答案都没有在我的情况下工作,但我最终使用像一个button的图像的setTagfunction。 我的帐户信息位于活动开始时设置的全局成员variables中。

在这种情况下,我设置了一个表,每行都是一个帐户。 点击图片时会显示帐户详细信息(图片只是一个信息图标)。
从而:

 // prior code.... // NOTE: oneAccount is an object (AccountInfo) holding information about the account // column with the "detail" arrow image1 = new ImageView(this); image1.setImageResource(R.drawable.info); image1.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); image1.setPadding(15, 1, 15, 1); image1.setTag(oneAccount); // add a listener to go to that account detail on a click image1.setOnClickListener(new TextView.OnClickListener() { public void onClick(View v) { // change the color to signify a click v.setBackgroundColor(getResources().getColor(R.color.button_selected)); // get what we need out of the tag AccountInfo thisAcct = (AccountInfo) v.getTag(); // your code would do other stuff here } }); // add the image to the table row tr1.addView(image1); 

使用像下面的代码实现OnClickListener

 public class Test extends Activity implements OnClickListener{ Button btn1; Button btn2; Button btn3; Button btn4; Button btn5; @Override protected void onCreate(Bundle savedInstanceState) { //initialize btn...~~~ btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); btn4.setOnClickListener(this); btn5.setOnClickListener(this); } @Override public void onClick(View view) { switch(view.getId()) { case will be determine by Button's Id (R.id.blablabla) } } 

如果您有与视图相关的静态内容,另一个选项是使用HashMap将视图ID映射到内容。

 private static Map<Integer, String> idToStringMap = new HashMap<Integer, String>(); 

onCreate初始化地图:

 idToStringMap.put(R.id.button1, "hello"); idToStringMap.put(R.id.button2, "world"); // ... 

然后从onClick获取视图ID的值:

 public void onClick(View v) { String myString = idToStringMap.get(v.getId()); } 

这比使用一整套开关盒要简单一些。

请注意,你在Kotlin中做这个和你在Java中做的有些不同。 在Kotlin中,将NameOfParentClass()追加到子类声明中。

现在重写Activity的onCreate()方法。 它会看起来像这样。

 class MainActivity : AppCompatActivity() { private var btnClick: Button? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnClick = findViewById(R.id.btnClick) as Button btnClick!!.setOnClickListener { startActivity(Intent(this@MainActivity, KotlinActivity::class.java)) } } } 

另一种解决scheme可能是不直接在onClick()方法中编写代码,或者在单独的方法中编写代码,然后在onClick()中调用该方法。

例:

 button.setOnClickListener(new OnClickListener() { public void onClick(View v) { function(); } }); private void function() { //your code here }