Подтвердить что ты не робот

Как передать параметры OnClickListener?

Как передать параметр OnClickListener()?

Получил мой слушатель:

   OnClickListener myListener = new OnClickListener()
   {

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

     }

  };

У меня есть 12 кнопок, и я не хочу писать 12 слушателей для них, было бы здорово просто передать им строку, и они могут делать совершенно разные вещи.

4b9b3361

Ответ 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
     }

  };

Ответ 2

Еще одно решение для этой проблемы,, вы можете создать обычный метод и передать ему 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)

           }
    });
}

Ответ 3

  • У вашей активности есть 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
           }
       }
    }
    

Ответ 4

Я знаю, что это поздний ответ, но, надеюсь, он может помочь кому-то. Ни один из существующих ответов не работал в моей ситуации, но в итоге я использовал функцию 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);

Ответ 5

использовать реализует 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 Id (R.id.blablabla)
        }
}

Ответ 6

Если у вас есть статический контент, связанный с представлением, другой вариант - использовать HashMap для сопоставления идентификатора вида с контентом.

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

Инициализировать карту в onCreate:

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

Затем введите значение из идентификатора вида в onClick:

public void onClick(View v) {

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

Это немного чище, чем использование длинного набора корпусов коммутаторов.

Ответ 7

Обратите внимание, что вы делаете это в Kotlin немного иначе, чем вы делаете это на Java. В Kotlin вы добавляете NameOfParentClass() к объявлению подкласса.

Теперь переопределите метод 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([email protected], KotlinActivity::class.java)) }
        }
    }

Ответ 8

Другое решение может заключаться в том, чтобы не писать код непосредственно внутри метода onClick(), альтернативно, писать код в отдельном методе, а затем вызывать этот метод в onClick().

Пример:

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

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