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

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

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

OnClickListener myListener = new OnClickListener() { @Override public void onClick(View v) { //I want to reach params here } }; 

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

Solutions Collecting From Web of "Как передать параметры OnClickListener?"

Используйте собственный пользовательский 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 } }; 

Еще одно решение для этой проблемы: вы можете создать обычный метод и передать ему View вы хотите добавить на него, и передать параметры, которые вы хотите использовать вместе с ним:

 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. Представьте, что ваша деятельность реализована 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 } } } 

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

Использование реализует 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) } } 

Если у вас есть статический контент, связанный с представлением, другой вариант – использовать 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()); } 

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

Обратите внимание, что вы делаете это в 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)) } } } 

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

Пример:

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