Как передать параметры OnClickListener?
Как передать параметр OnClickListener ()?
Получил мой слушатель:
OnClickListener myListener = new OnClickListener() { @Override public void onClick(View v) { //I want to reach params here } };
У меня есть 12 кнопок, и я не хочу писать 12 слушателей для них, было бы здорово просто передать им строку, и они могут делать совершенно разные вещи.
- Добавление onclicklistener в listview (android)
- Кнопка пользовательской формы Android
- OnItemClickListener и OnClickListener не работают в ListView
- Добавление кнопки OnClick в сообщение в уведомлении
- RecyclerView onClick
Используйте собственный пользовательский 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) } }); }
- Представьте, что ваша деятельность реализована 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 } } }
Я знаю, что это поздний ответ, но, надеюсь, он может помочь кому-то. Ни один из существующих ответов не работал в моей ситуации, но в итоге я использовал функцию 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 idToStringMap = new HashMap();
Инициализировать карту в 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()
в объявление подclassа.
Теперь переопределите метод 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([email protected], KotlinActivity::class.java)) } } }
Другое решение может заключаться в том, чтобы не писать код непосредственно внутри метода onClick (), иначе написать код в отдельном методе, а затем вызвать этот метод в onClick ().
Пример:
button.setOnClickListener(new OnClickListener() { public void onClick(View v) { function(); } }); private void function() { //your code here }