Кнопка Android SetOnClickListener Design Help
Я создаю приложение для Android. Я заметил, что создаю много повторений кода, подобных этому в каждом из моих классов:
Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
Теперь у меня есть 15 кнопок, и это делает мой код уродливым. Кто-нибудь имеет класс или некоторые примеры, о том, как я могу превратить все эти коды в нечто более эффективное, поэтому я могу:
- Создать кнопку OBJ {Кнопка ButtonX (Кнопка) findViewById (R.id.buttonXName);}
- Установите прослушиватель {buttonX.setOnClickListener(новый OnClickListener()}
- Определите, было ли нажато {public void onClick (View v)}
- Затем запустите определенный код для каждой кнопки?
Если кто-нибудь знает что-нибудь, я был бы признателен.
Ответы
Ответ 1
Если вы нацелились на 1.6 или новее, вы можете использовать android: onClick xml атрибут, чтобы удалить часть повторяющегося кода. См. это сообщение в блоге от Ромена Гая.
<Button
android:height="wrap_content"
android:width="wrap_content"
android:onClick="myClickHandler" />
И в классе Java используйте следующие строки кода:
class MyActivity extends Activity {
public void myClickHandler(View target) {
// Do stuff
}
}
Ответ 2
Внедрите OnClickListener() в свою активность...
public class MyActivity extends Activity implements View.OnClickListener {
}
Для каждой кнопки используйте...
buttonX.setOnClickListener(this);
В вашем методе проверки onClick() для какой кнопки это...
@Override
public void onClick(View view) {
if (View.equals(buttonX))
// Do something
}
Также в onClick вы можете использовать view.getId(), чтобы получить идентификатор ресурса, а затем использовать его в блоке switch/case, чтобы идентифицировать каждую кнопку и выполнить соответствующее действие.
Ответ 3
Лучшее решение будет работать с корпусом коммутатора следующим образом:
public void registerButtons(){
register(R.id.buttonName1);
register(R.id.buttonName2);
register(R.id.buttonName3);
}
private void register(int buttonResourceId){
findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}
private OnClickListener buttonClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch (v.getId()) {
case R.id.buttonName1:
// TODO Auto-generated method stub
break;
case R.id.buttonName2:
// TODO Auto-generated method stub
break;
case View.NO_ID:
default:
// TODO Auto-generated method stub
break;
}
}
};
Ответ 4
Так как setOnClickListener
определяется на View
not Button
, если вам не нужна переменная для чего-то еще, вы можете сделать это немного ниже:
findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
Ответ 5
Вы можете использовать массив для обработки нескольких прослушивателей нажатия кнопок в android следующим образом:
здесь я устанавливаю кнопку для прослушивания кнопок для кнопок n, используя массив как:
Button btn[] = new Button[n];
ПРИМЕЧАНИЕ: n - постоянное положительное целое число
Пример кода:
//class androidMultipleButtonActions
package a.b.c.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class androidMultipleButtonActions extends Activity implements OnClickListener{
Button btn[] = new Button[3];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn[0] = (Button) findViewById(R.id.Button1);
btn[1] = (Button) findViewById(R.id.Button2);
btn[2] = (Button) findViewById(R.id.Button3);
for(int i=0; i<3; i++){
btn[i].setOnClickListener(this);
}
}
public void onClick(View v) {
if(v == findViewById(R.id.Button1)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button2)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button3)){
//do here what u wanna do.
}
}
}
Примечание. Сначала напишите файл main.xml, если вы не знаете, как писать, пожалуйста, напишите:
[email protected]
Ответ 6
Я думаю, вы обычно можете делать то, что вам нужно, в цикле, что намного лучше, чем многие методы onClick
, если это можно сделать.
Отметьте этот ответ для демонстрации того, как использовать цикл для аналогичной проблемы. То, как вы создаете свой цикл, будет зависеть от потребностей ваших функций onClick
и того, насколько они похожи друг на друга. Конечный результат - гораздо менее повторяющийся код, который легче поддерживать.
Ответ 7
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
}
}