如何将参数传递给OnClickListener()?
得到了我的听众:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
我有12个按钮,我不想为他们写12个听众,将字符串传递给他们会很棒,他们可以做完全不同的事情。
答案 0 :(得分:152)
使用您自己的自定义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
}
};
答案 1 :(得分:21)
该问题的另一个解决方案,您可以创建一个常规方法并将View
添加到onClickListener
传递给它,并传递参数:
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)
}
});
}
答案 2 :(得分:7)
根据点击的按钮处理字符串
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
}
}
}
答案 3 :(得分:7)
我知道这是一个迟到的答案,但希望它可以帮助某人。现有的答案都没有在我的情况下起作用,但我最终使用的图像的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);
答案 4 :(得分:0)
使用实现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)
}
}
答案 5 :(得分:0)
如果您有与视图关联的静态内容,则另一个选项是使用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());
}
这比使用一长串开关盒更清洁。
答案 6 :(得分:0)
请注意,您在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)) }
}
}
答案 7 :(得分:0)
在科特林:
在这里,我正在传递视图作为其他视图的参数onClick
首先在xml布局中定义您的 Handler 类对象:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="handler"
type="com.demoapp.controllers.Handler" />
</data>
并定义执行点击功能的按钮。
<Button
android:id="@+id/button2"
android:onClick="@{(view) -> handler.getbuttonClickEvent(textViewId)}"
.../>
,您的文本视图如下: 请记住,您的 TextView ID 将像 textViewId
那样转换<TextView
android:id="@+id/text_view_id"
... />
处理程序类中的最终设置方法
fun getbuttonClickEvent(view: TextView){
view.text="Hello World"
}
答案 8 :(得分:-1)
另一种解决方案可能是不直接在onClick()方法中编写代码,或者在单独的方法中编写代码,然后在onClick()中调用该方法。
示例:
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
function();
}
});
private void function() {
//your code here
}