Android: использовать оператор SWITCH с setOnClickListener/onClick для более чем 1 кнопки?

Допустим, у меня есть несколько кнопок в LinearLayout, две из них:

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards));
exit_button = ((Button)this.findViewById(R.id.Button_Exit));

Я регистрирую setOnClickListener() на обоих:

mycards_button.setOnClickListener(this);
exit_button.setOnClickListener(this);

Как мне сделать ПЕРЕКЛЮЧАТЕЛЬ, чтобы различать две кнопки в Onclick?

public void onClick(View v) {
  switch(?????){
    case ???:
      /** Start a new Activity MyCards.java */
      Intent intent = new Intent(this, MyCards.class);
      this.startActivity(intent);
      break;
    case ???:
      /** AlerDialog when click on Exit */
      MyAlertDialog();
      break;
}

person Hubert    schedule 01.10.2009    source источник
comment
Я предпочитаю не использовать для этого меню, так как я могу разместить кнопки в любом месте макета...   -  person Hubert    schedule 01.10.2009


Ответы (7)


Использовать:

  public void onClick(View v) {

    switch(v.getId()){

      case R.id.Button_MyCards: /** Start a new Activity MyCards.java */
        Intent intent = new Intent(this, MyCards.class);
        this.startActivity(intent);
        break;

      case R.id.Button_Exit: /** AlerDialog when click on Exit */
        MyAlertDialog();
        break;
    }
}

Обратите внимание, что это не будет работать в проектах библиотеки Android (из-за http://tools.android.com/tips/non-constant-fields), где вам нужно будет использовать что-то вроде:

int id = view.getId();
if (id == R.id.Button_MyCards) {
    action1();
} else if (id == R.id.Button_Exit) {
    action2();
}
person Intrications    schedule 01.10.2009
comment
работает просто великолепно! Удивительно, как я не попробовал это сам! Большое спасибо, чувак. ЧАС. - person Hubert; 01.10.2009
comment
Когда я делаю это, затмение говорит мне: выражения регистра должны быть постоянными выражениями. - person dell116; 20.06.2012
comment
@dell116 dell116 Это говорит вам об этом, потому что переменная, которую вы используете в случае, не является константой. Объявите переменную, на которую он жалуется, как окончательную, например final int x = 5;, или объявите переменную y final int y = x; непосредственно перед переключением, если x необходимо изменить до достижения регистра. - person aggregate1166877; 28.08.2012
comment
Вы не можете использовать R.id.* в случае переключателя, поскольку они не являются переменными final. - person Gaurav Vaish; 28.05.2013
comment
@MasterGaurav Вы можете использовать R.id.*, если это не проект библиотеки Android: tools .android.com/tips/non-constant-fields. Я добавлю примечание к ответу, чтобы решить эту проблему. - person Intrications; 28.05.2013
comment
@Intrications, а как насчет пользовательских диалогов? (IK, они устарели) - person Yousha Aleayoub; 24.03.2016

Другой вариант — добавить новый OnClickListener в качестве параметра в setOnClickListener() и переопределить метод onClick():

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit));

// Add onClickListener to mycards_button
mycards_button.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        // Start new activity
        Intent intent = new Intent(this, MyCards.class);
        this.startActivity(intent);
    }
});

// Add onClickListener to exit_button
exit_button.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        // Display alertDialog
        MyAlertDialog();
    }
});
person aspartame    schedule 07.10.2009
comment
Я всегда считал, что это действительно грязно - person Faisal Abid; 08.10.2009
comment
Мне это нравится, но я думаю, это во многом вопрос личных предпочтений. - person aspartame; 08.10.2009
comment
Нет, не используйте его. Потому что каждый раз, когда вы используете setOnclickListener(new OnclickLisener(){...}); Android создает новую цепочку событий, чтобы отслеживать действия. Итак, представьте, что если у вас 10 кнопок, 10 нитей, это нехорошо. - person Cocorico; 12.06.2014
comment
@Cocorico Android не создает поток для каждого OnClickLister. - person cyroxis; 01.08.2014
comment
@cyronix. Серьезно ? Мой учитель по андроиду сказал нам это. Но вы правы, этот метод не элегантен? - person Cocorico; 01.08.2014

внутри метода OnCreate: -

{

    Button b = (Button)findViewById(R.id.button1);
    b.setOnClickListener((View.OnClickListener)this);

    b = (Button)findViewById(R.id.button2);
    b.setOnClickListener((View.OnClickListener)this);
} 

@Override
public void OnClick(View v){

    switch(v.getId()){
         case R.id.button1:
             //whatever
             break;

         case R.id.button2:
             //whatever
             break;
}
person ayushnvijay    schedule 06.06.2015
comment
Вам не нужно приводить свою активность к OnClickListener, если она реализует интерфейс OnClickListener. - person winklerrr; 24.03.2017

И есть еще третий вариант. В методе onCreate() найдите все имеющиеся представления кнопок и сохраните их как члены данных класса. Затем вы можете каскадировать группу операторов if-else, чтобы определить, что есть что. Это немного запутанно, но это необходимо, если вы не знаете идентификатор кнопок (что может быть сложно, если вы генерируете кнопки в Java-коде).

@Override
public void onClick(View v) {
    if (v == m_myCards) {
        Intent intent = new Intent(this, MyCards.class);
        this.startActivity(intent);
    }
    else if (v == m_exit) {
        MyAlertDialog();
    }
    else if (v == m_back) {
        finish();            
    }

Еще одним приятным моментом этого метода является то, что он гибкий и быстрый (нет необходимости анализировать идентификаторы). Плохо то, что виджеты нужно держать в памяти.

Не знаю, какой метод лучше.

person SMBiggs    schedule 05.06.2012
comment
Возможно ли это также с помощью оператора переключателя? - person winklerrr; 24.03.2017
comment
@winklerrr - Нет, операторы переключения в Java требуют констант, а не переменных. Вот почему в этом примере используется менее элегантная серия операторов if-else. - person SMBiggs; 09.04.2017
comment
А что, если вы объявите метод так: onClick(final View v)? - person winklerrr; 10.04.2017
comment
@winklerrr — Хорошая попытка! Компилятор по-прежнему считает, что v — это переменная, и будет жаловаться, как старик. Некоторые языки допускают переменные, но Java — нет. Распространенным обходным решением является использование идентификатора представления. Примеры см. в ответах ayushnvijay или Droidvilla. - person SMBiggs; 22.04.2017

Я делаю это просто: если макет такой же, я просто выражаю намерение.

Мой код такой:

public class RegistrationMenuActivity extends AppCompatActivity implements View.OnClickListener {


    private Button btnCertificate, btnSeminarKit;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration_menu);

        initClick();
    }

    private void initClick() {
        btnCertificate = (Button) findViewById(R.id.btn_Certificate);
        btnCertificate.setOnClickListener(this);

        btnSeminarKit = (Button) findViewById(R.id.btn_SeminarKit);
        btnSeminarKit.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_Certificate:
                break;
            case R.id.btn_SeminarKit:
                break;
        }
        Intent intent = new Intent(RegistrationMenuActivity.this, ScanQRCodeActivity.class);
        startActivity(intent);
    }
}
person Uray Febri    schedule 25.07.2018

В моем примере: сначала «MainActivity» реализует «View.OnClickListener», чем запускает код….

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();}


public void init(){

    foryou = (Button) this.findViewById(R.id.btn_foryou);
    following = (Button) findViewById(R.id.btn_following);
    popular = (Button) findViewById(R.id.btn_popular);
    watching = (Button) findViewById(R.id.btn_continuewatching);
    mProgress = (ProgressBar) findViewById(R.id.pb);

    foryou.setOnClickListener(this);
    following.setOnClickListener(this);
    popular.setOnClickListener(this);
    watching.setOnClickListener(this);
    mProgress.setOnClickListener(this);
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_foryou:
            foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

            break;
        case R.id.btn_following:
            following.setPaintFlags(following.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

            break;
        case R.id.btn_popular:
            popular.setPaintFlags(popular.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

            break;
        case R.id.btn_continuewatching:
            watching.setPaintFlags(watching.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

            break;
        case R.id.btn_5:
            // foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

            break;
        default:
            foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

    }
}
person    schedule 12.10.2018

есть еще один хороший способ, и он не отнимает ваше время

создайте метод, чтобы делать все, что вы хотите, например, в своей деятельности

public void replaceSuggest(View v) {
        optionPanel.setVisibility(View.VISIBLE);
        replaceWith.setVisibility(View.VISIBLE);
        searchEdit.setText(selected);

    }

после создания метода перейдите к макету представления xml и введите следующее (в представлении, в котором вы хотите применить это действие, например, TextView выполнит щелчок:

 <TextView
                        android:id="@+id/anyId"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="@string/replace"
                        android:textColor="#ffffff"
                        android:gravity="center_vertical"
                        android:paddingLeft="8dp"
                        android:paddingRight="4dp"
                        android:textSize="12dp"
// here you write the methode name after onClick
                        android:onClick="replaceSuggest"/>
person Hasni    schedule 06.06.2021