如何将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一个常规的方法,并传递给你要添加onClickListener
的View
,并传递你想要使用的参数 :
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) } }); }
- 让你的活动实现View.OnClickListener
- 将您的button注册到侦听器
- 检查onClick中点击哪个button
-
处理您的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 }