Как передать параметры в OnClickListener?
Как я могу передать параметр OnClickListener ()?
получил мой слушатель:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
У меня есть 12 кнопок и я не хочу писать 12 слушателей для них, было бы здорово, чтобы просто передать строку, и они могут сделать абсолютно разные вещи.
8 ответов:
использовать свой собственный 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вы хотите, чтобы добавить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) } }); }
- есть ваша деятельность реализовать вид.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, как показано ниже code
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()); }это немного чище, чем использование длинного набора переключателей.
обратите внимание, что Вы делаете это в Котлине немного иначе, чем в Java. В Котлине вы добавляете
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(this@MainActivity, KotlinActivity::class.java)) } } }
другое решение может заключаться в том, чтобы не писать код непосредственно внутри метода onClick (), либо написать код в отдельном методе, а затем вызвать этот метод в onClick().
пример:
button.setOnClickListener(new OnClickListener() { public void onClick(View v) { function(); } }); private void function() { //your code here }
Comments