android-如何将参数传递给OnClickListener?
如何将参数传递给OnClickListener()?
得到了我的听众:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
我有12个按钮,但我不想为它们编写12个侦听器,将一个字符串传递给它们会很棒,它们可以完成完全不同的事情。
8个解决方案
152 votes
使用您自己的自定义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
}
};
Sherif elKhatib answered 2019-10-10T16:29:46Z
21 votes
针对该问题的另一种解决方案,您可以创建一个常规方法并将要添加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)
}
});
}
Muhammed Refaat answered 2019-10-10T16:30:12Z
7 votes
让您的活动实现View.OnClickListener
将按钮注册到侦听器
检查在onClick中单击了哪个按钮
根据单击的按钮来处理字符串
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
}
}
}
Mark Pazon answered 2019-10-10T16:31:17Z
6 votes
我知道这是一个较晚的答案,但希望它可以对某人有所帮助。 在我的情况下,现有的答案都无效,但是我最终使用了像按钮一样作用的图像的setTag功能。 我的帐户信息在活动开始时设置的全局成员变量中。
在这种情况下,我要建立一个表,每一行都是一个帐户。 单击图像时会显示帐户详细信息(图像只是一个信息图标)。
从而:
// 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);
Gravitoid answered 2019-10-10T16:31:59Z
0 votes
使用以下代码实现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)
}
}
Joonsung Kim answered 2019-10-10T16:32:27Z
0 votes
如果您具有与视图关联的静态内容,则另一个选择是使用onClick将视图ID映射到内容。
private static Map idToStringMap = new HashMap();
在onClick中初始化地图:
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());
}
这比使用一整套开关盒要干净一点。
Suragch answered 2019-10-10T16:33:22Z
0 votes
请注意,您在Kotlin中执行此操作与在Java中执行此操作有些不同。 在Kotlin中,将onCreate()追加到子类声明中。
现在,请改用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)) }
}
}
Shraddha Patel answered 2019-10-10T16:33:56Z
-1 votes
另一个解决方案可能是不直接在onClick()方法内编写代码,或者,在单独的方法中编写代码,然后在onClick()中调用该方法。
例:
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
function();
}
});
private void function() {
//your code here
}
HANGOZADA answered 2019-10-10T16:34:25Z