Android один метод OnClick для нескольких кнопок? - PullRequest
24 голосов
/ 24 октября 2011

Я немного запустил программу в Android, У меня есть 3 кнопки в одном упражнении.

Я видел несколько примеров кодов, которые присваивают одно и то же событие OnClick всем кнопкам (даже если они выполняют совершенно разные действия) и в методе Switch(id) case case case ...

Какой подход лучше? один onClick метод и переключение или много методов, по одному на каждую кнопку?

Спасибо.

Ответы [ 6 ]

34 голосов
/ 03 апреля 2012

Используйте этот способ:

@Override
public void onCreate(Bundle savedInstanceState) {
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
}

private OnClickListener onClickListener = new OnClickListener() {
     @Override
     public void onClick(View v) {
         switch(v.getId()){
             case R.id.button1:
                  //DO something
             break;
             case R.id.button2:
                  //DO something
             break;
             case R.id.button3:
                  //DO something
             break;
         }

   }
};
23 голосов
/ 24 октября 2011

Если вы хотите уменьшить количество строк кодирования, тогда используйте View's OnClick() with switch statement, а если вы хотите обрабатывать все щелчки отдельно (для простоты понимания и обслуживания кода), тогда используйте отдельные все button's onClick().

Обновление:

Если вы объявили «Кнопки» в своем XML-файле макета «Активность», напишите атрибут android:onClick="" с одинаковым именем метода для всех кнопок и внедрите этот метод в свою деятельность.Теперь у вас есть один метод для всех кнопок, и в этом методе различайте кнопки с идентификатором.

Пример:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:onClick="buttonOnClick"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button 1" />
    <Button android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:onClick="buttonOnClick"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button 2" />
    <Button android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:onClick="buttonOnClick"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button 3" />
</LinearLayout>

Теперь в вашем Activity реализуйте buttonOnClick как,

public void buttonOnClick(View view)
{
 switch(view.getId())
 {
  case R.id.button1:
  // Code for button 1 click
  break;

  case R.id.button2:
  // Code for button 2 click
  break;

  case R.id.button3:
  // Code for button 3 click
  break;
 }
}

Или вы можете применить тот же регистр переключателей для динамически добавляемых кнопок в вашей деятельности, например, вместо buttonOnClick вы должны использовать реализованный OnClickListerner's View onClick.

6 голосов
/ 24 октября 2011
this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook);
this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener);

public OnClickListener backButtonClickListener = new OnClickListener()
{
public void onClick(final View view)
{
   if (view == MatchInfoActivity.this.btnBack)
    {
        MatchInfoActivity.this.finish();
    }
    if( view == MatchInfoActivity.this.btnAddFried){
       Intent i = new Intent(Intent.ACTION_VIEW);
       MatchInfoActivity.this.startActivity(i);
    }
    if( view == MatchInfoActivity.this.btnAddBuddy){
       Intent i = new Intent(Intent.ACTION_VIEW);
       MatchInfoActivity.this.startActivity(i);
    }
}
};

Вот хороший способ.

2 голосов
/ 24 октября 2011

Я думаю, что регистрация onClick в XML (верстка) - лучший подход.

EDIT:

Найдено связанных тем:

  1. Лучшая практика для определения событий кнопок в Android
  2. рекомендации по обработке событий пользовательского интерфейса
0 голосов
/ 30 мая 2015

Небольшое дополнение к ответу @Nguyen.

findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener);
....    ....    ....    ....
findViewById(R.id.buttonN).setOnClickListener(buttonClickListener);

private View.OnClickListener buttonClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.buttonOne:
                // do something
                break;
            ....    ....    ....    ....
            case R.id.buttonN:
                // do something
                break;
        }
    }
};

Это может быть полезно, если вы не хотите инициализировать переменную кнопки, но хотите отслеживать событие нажатия кнопки.Спасибо!

0 голосов
/ 14 мая 2015

Зарегистрированное событие onClick в макете XML, а затем обработать его в коде. Вот как бы я это сделал:

<Button
android:id="@+id/btplus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me"
android:onClick="onBtnClicked">

Метод в .class

public void onBtnClicked(View v) {
        switch (v.getId()) {
        case R.id.btplus:
            Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show(); 
            break;
        case R.id.btminu:
            Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...