64

如何将参数传递给 OnClickListener() ?

得到我的听众:

   OnClickListener myListener = new OnClickListener()
   {

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

     }

  };

我有 12 个按钮,我不想为它们编写 12 个侦听器,将字符串传递给它们会很棒,它们可以做完全不同的事情。

4

9 回答 9

159

使用您自己的自定义 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
     }

  };
于 2012-05-16T08:31:57.297 回答
29

该问题的另一个解决方案是,您可以创建一个常规方法并将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)

           }
    });
}
于 2014-08-20T08:00:06.467 回答
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);
于 2014-05-20T13:52:39.877 回答
8
  1. 让您的活动实现 View.OnClickListener
  2. 将您的按钮注册到侦听器
  3. 检查onClick中点击了哪个按钮
  4. 根据单击的按钮处理您的字符串

    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
           }
       }
    }
    
于 2012-05-16T08:38:54.450 回答
1

如果您有与视图关联的静态内容,另一种选择是使用 aHashMap将视图 ID 映射到内容。

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

初始化地图onCreate

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

然后从视图 id 中获取值onClick

public void onClick(View v) {

    String myString = idToStringMap.get(v.getId());
}

这比使用一长串开关盒要干净一些。

于 2016-09-13T04:30:28.857 回答
1

在科特林:

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

final set up method in your Handler class

fun getbuttonClickEvent(view: TextView){
        view.text="Hello World"
    }
于 2019-11-25T14:13:19.353 回答
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)
        }
}
于 2012-05-16T08:33:31.563 回答
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)) }
        }
    }
于 2017-02-14T09:30:23.957 回答
-1

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

例子:

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

private void function() {
 //your code here
}
于 2014-04-09T09:16:29.230 回答