Intereting Posts
Android-эмулятор не получает push-уведомления Как преобразовать 16-битный бит байтового массива PCM в двойной или плавающий массив? Как включить динамик Android во время разговора, от кода? Несколько объектов EditText в AlertDialog Ошибка построения несоответствия архитектуры процессора Очистить все действия в задаче? Изменение цвета фона вкладки TabLayout (библиотека поддержки дизайна Android) не занимает всего пространства табуляции Google-plus: невозможно загрузить человека Повторяющиеся файлы, включая масляный нож с градиентом Как сделать PreferenceActivity запустите диалоговое окно для настройки пользовательских настроек Pixel-пусковая установка продолжает останавливаться в эмуляторе Android 7.1.1 (API 25) Вертикальное раздвижное меню в Android Как определить границы страницы паспорта с помощью OpenCV? Android – как получить или установить (распечатать) DPI (точек на дюйм) файла JPEG при загрузке или сохранении программно? Когда мне следует называть close () на SQLiteOpenHelper, используемом ContentProvider

Как передать параметры 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 }