【问题标题】:How to pass parameters to OnClickListener?如何将参数传递给 OnClickListener?
【发布时间】:2012-05-16 08:28:24
【问题描述】:

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

找到我的听众:

   OnClickListener myListener = new OnClickListener()
   {

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

     }

  };

我有 12 个按钮,但我不想为它们编写 12 个侦听器,最好只向它们传递一个字符串,它们可以做完全不同的事情。

【问题讨论】:

    标签: android onclicklistener


    【解决方案1】:

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

    【讨论】:

    • 与使用成员变量然后将值分配给它并在 onClick 中访问它相比,此方法有什么优势吗?如果是什么?
    • 这回答了这个问题,尽管它也表明 Listener 应该被设计为一种方法,而不是一个完整的类。使用自定义参数传递匿名方法会简单得多(例如 View v)
    • 这是最干净、可读且易于维护的解决方案。内部成员的优势 - 清楚地表明 onClick 方法需要什么才能正常工作并强制您在将其分配给按钮时传递正确的参数。不要忘记您可以使用 javadoc 来描述这个特定侦听器的用途,并在需要时重用它。
    【解决方案2】:

    该问题的另一种解决方案,您可以创建一个常规方法并将您想要添加的View 传递给它onClickListener,然后传递参数 strong> 你想和它一起使用:

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

    【讨论】:

    • @vijayraj34 我的荣幸 :))
    【解决方案3】:

    我知道这是一个迟到的答案,但希望它可以帮助某人。现有的答案在我的情况下都不起作用,但我最终使用了像按钮一样的图像的 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】:
    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
             }
         }
      }
      

    【讨论】:

      【解决方案5】:

      如果您有与视图关联的静态内容,另一种选择是使用 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中的view id中获取值:

      public void onClick(View v) {
      
          String myString = idToStringMap.get(v.getId());
      }
      

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

      【讨论】:

        【解决方案6】:

        在 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"
                ... />
        

        您的处理程序类

        中的最终设置方法
        fun getbuttonClickEvent(view: TextView){
                view.text="Hello World"
            }
        

        【讨论】:

          【解决方案7】:

          使用实现 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)
                  }
          }
          

          【讨论】:

            【解决方案8】:

            请注意,在 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)) }
                    }
                }
            

            【讨论】:

              【解决方案9】:

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

              例子:

              button.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                  function();
                 }
              });
              
              private void function() {
               //your code here
              }
              

              【讨论】:

              • 好的,但问题明确指出需要传递参数
              • 不会让他传递参数
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-09
              • 2012-12-21
              • 2012-01-07
              相关资源
              最近更新 更多