如何向OnClickListener传递参数?

67

如何向OnClickListener()传递参数?

已获取我的Listener:

   OnClickListener myListener = new OnClickListener()
   {

     @Override
     public void onClick(View v)
     {
         //I want to reach params here

     }

  };

我有12个按钮,不想为它们编写12个监听器,只需向它们传递一个字符串,它们就可以完成完全不同的任务,这将是很好的。

9个回答

160

使用自定义的 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
这种方法与使用成员变量并将值分配给它并在onClick内部访问它相比有什么优势吗?如果有,是什么? - Sreekanth Karumanaghat
这回答了问题,但也表明Listener应该被设计为一个方法而不是一个完整的类。通过传递带有自定义参数(例如View v)的匿名方法会更简单。 - Andrej K
1
这是最干净、易读和易于维护的解决方案。内部成员的优点在于清楚地指示了onClick方法需要正常工作的内容,并强制您在将其分配给按钮时传递正确的参数。不要忘记您可以使用javadoc来描述此特定监听器的目的,并在需要时重用它。 - mihail

30

另一个解决方法是,您可以创建一个常规方法,并将要添加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
@vijayraj34 我很高兴:)) - Muhammed Refaat

9
我知道这个答案有些晚了,但希望能对某些人有所帮助。在我的情况下,现有的答案都无法解决问题,但最终我使用了一个充当按钮的图像的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);

很棒的稳定方法 :) 可以平稳地与数据绑定一起使用。谢谢。 - Maher Abuthraa

8
  1. Have your activity implement View.OnClickListener
  2. Register your buttons to the listener
  3. Check which button is clicked in onClick
  4. Process your string depending on which button was clicked

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

1
如果您的视图与静态内容相关联,另一个选项是使用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());
}

这比使用一长串的switch case更加简洁。

1
在Kotlin中:
这里我将一个视图作为另一个视图的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"
        ... />

在您的Handler类中的最终设置方法

fun getbuttonClickEvent(view: TextView){
        view.text="Hello World"
    }

0
请像下面的代码一样使用 implements 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)
        }
}

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

-1

另一个解决方案可能是不直接在onClick()方法中编写代码,而是将代码编写在单独的方法中,然后在onClick()中调用该方法。

例如:

button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    function();
   }
});

private void function() {
 //your code here
}

1
好的,但问题明确指定了需要传递参数。 - Jose_GD
这不会使他能够传递参数。 - Muhammed Refaat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接