2012-02-09 2 views
4

Можно ли передать аргумент для слушателя при нажатии кнопки:Пропустить аргумент при вызове setOnClickListener?

protected void onCreate(Bundle savedInstanceState) { 
    .... 

    String myArg = "Hello"; 
    Button button1 = (Button)findViewById(R.id.myButton); 
    button1.setOnClickListener(myListener); 

    String myArg = "Goodye"; 
    Button button2 = (Button)findViewById(R.id.myOtherButton); 
    button2.setOnClickListener(myListener); 
} 

OnClickListener clickListener = new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
      // print the value from the passed in argument myArg 
     Log.v("TEST", myArg);   
    } 
}; 

Это просто пример, а не отражение того, что я на самом деле wan't сделать, но он иллюстрирует этот вопрос.

В основном я хочу передать myArg слушателю, поэтому, когда кнопка нажата, у нее есть доступ к переменной myArg.

Я знаю, что могу сделать это как встроенный анонимный класс, но у меня будет много кнопок, и логика щелчка будет одинаковой для всех из них. Мне нужен аргумент, поскольку для каждой кнопки это будет отличаться.

FYI: Мое реальное использование требует, чтобы аргументом был объект View.

+0

Когда вам нужна переменная связана? Другими словами, когда вы определяете значение переменной, к которой вы хотите иметь доступ к 'onClickListener()'? –

ответ

5

Почему бы просто не создать класс, который реализует View.OnClickListener? Это было бы идеально, если бы вы повторно использовали код для каждой кнопки.

public class MyListener implements View.OnClickListener 
{ 
    private View mView; 

    public MyListener(View v) { 
     mView = v; 
    } 

    @Override 
    public void onClick(View v) { 
     // Use mView here if needed    
    } 
} 

И затем использовать его, как вы бы нормально:

OnClickListener listener = new MyListener(myView); 
+0

Так очевидно, когда я смотрю на этот пример. Я довольно новичок в программировании на Java и Android, и у меня больше опыта с Objective-c, так что я все еще обдумываю все это. Благодаря! – Camsoft

6

Я думаю, что типичный способ, которым адресован этот вид задачи является проверка идентификатора целевого Клик:

OnClickListener clickListener = new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if (v.getId()==R.id.myButton) { 
      // 
     } elseif (v.getId()==R.id.myOtherButton) { 
      // 
     }  
    } 
}; 

Если это недостаточно, вы можете использовать общий тег свойство вида:

Button button1 = (Button)findViewById(R.id.myButton); 
button1.setTag("Hello"); 
button1.setOnClickListener(myListener); 

Button button2 = (Button)findViewById(R.id.myOtherButton); 
button2.setTag("Goodye"); 
button2.setOnClickListener(myListener); 

... 
OnClickListener clickListener = new View.OnClickListener() { 

@Override 
public void onClick(View v) { 
     // print the value from the passed in argument myArg 
    Log.v("TEST", v.getTag());   
    } 
}; 

И, наконец, вы можете даже установить несколько тегов:

button1.setTag(R.id.arg1, "Hello"); 
button1.setTag(R.id.arg2, "World"); 

бы которые соответствуют вашим целям?

Смежные вопросы