Как передать параметры OnClickListener?
Как передать параметр OnClickListener()?
Получил мой слушатель:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
У меня есть 12 кнопок, и я не хочу писать 12 слушателей для них, было бы здорово просто передать им строку, и они могут делать совершенно разные вещи.
Ответы
Ответ 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
}