Использование оператора Switch для обработки нажатий кнопок - PullRequest
14 голосов
/ 14 февраля 2011

Я пытаюсь обернуть голову вокруг Views, Listeners и т. Д. У меня есть Activity с 2 кнопками: buttonplay и buttontop. Моя проблема в том, что я не могу полностью обернуть голову вокруг Views и Listeners, чтобы сгенерировать рабочий оператор switch.

Например, мне бы хотелось создать SINGLE Listener и каким-то образом использовать его, чтобы определить, какая кнопка нажата. Затем каким-то образом используйте идентификатор кнопки, нажатой в моем операторе switch, но все, что я нахожу в сети, похоже, использует SEPARATE слушатели для каждой кнопки, а затем каким-то образом использует View в качестве аргумента оператора Switch.

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

Я хочу управлять MediaPlayer в зависимости от того, какая кнопка нажата. У меня есть:

   Button b1 = (Button) findViewById(R.id.buttonplay);       
    b1.setOnClickListener(new View.OnClickListener()         
    {

        public void onClick(View v) {
           // Perform action on click
          switch(v.getId()) {
          case R.id.buttonplay:
          //Play voicefile
          MediaPlayer.create(getBaseContext(), R.raw.voicefile).start();
          break;
          case R.id.buttonstop:
          //Stop MediaPlayer
              MediaPlayer.create(getBaseContext(), R.raw.voicefile).stop();
          break;
         }
   }
    });

В конечном счете, я бы хотел, чтобы наиболее простой способ включался при нажатии любой кнопки. Я полагаю, что большая часть моей путаницы проистекает из того, как onClickListeners и Views используются в этом контексте.

Ответы [ 6 ]

41 голосов
/ 14 февраля 2011

Один из способов достижения этого - заставить ваш класс реализовать OnClickListener, а затем добавить его к своим кнопкам следующим образом:

Пример:

//make your class implement OnClickListener
public class MyClass implements OnClickListener{

        ...

        //Create your buttons and set their onClickListener to "this"
        Button b1 = (Button) findViewById(R.id.buttonplay);   
        b1.setOnClickListener(this);

        Button b2 = (Button) findViewById(R.id.buttonstop);   
        b2.setOnClickListener(this);

        ...

        //implement the onClick method here
        public void onClick(View v) {
           // Perform action on click
          switch(v.getId()) {
            case R.id.buttonplay:
              //Play voicefile
              MediaPlayer.create(getBaseContext(), R.raw.voicefile).start();
              break;
            case R.id.buttonstop:
              //Stop MediaPlayer
              MediaPlayer.create(getBaseContext(), R.raw.voicefile).stop();
              break;
          }
       }
}

Для получения дополнительной информации см. AndroidРазработчики> Обработка событий пользовательского интерфейса .

6 голосов
/ 14 февраля 2011

Просто измените класс (я полагаю, это основное действие), чтобы реализовать View.OnClickListener, и в методе onClick поместите общие действия onClick, которые вы хотите поместить:

public class MediaPlayer extends Activity implements OnClickListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    Button b1 = (Button) findViewById(R.id.buttonplay);       
    b1.setOnClickListener(this);
    //{YOUR APP}
}


@Override
public void onClick(View v) {
    // Perform action on click
    switch(v.getId()) {
    case R.id.buttonplay:
        //Play voicefile
        MediaPlayer.create(getBaseContext(), R.raw.voicefile).start();
        break;
    case R.id.buttonstop:
        //Stop MediaPlayer
        MediaPlayer.create(getBaseContext(), R.raw.voicefile).stop();
        break;
    }

}}

Я взял это из этого видео: http://www.youtube.com/watch?v=rm-hNlTD1H0. Это хорошо для начинающих.

4 голосов
/ 01 сентября 2014

Привет, переключаться между кнопками довольно просто, используя корпус переключателя: -

 package com.example.browsebutton;


    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;

        public class MainActivity extends Activity implements OnClickListener {
        Button b1,b2;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                b1=(Button)findViewById(R.id.button1);

                b2=(Button)findViewById(R.id.button2);
                b1.setOnClickListener(this);
                b2.setOnClickListener(this);
            }



            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                 int id=v.getId();
                 switch(id) {
                    case R.id.button1:
                  Toast.makeText(getBaseContext(), "btn1", Toast.LENGTH_LONG).show();
                //Your Operation

                  break;

                    case R.id.button2:
                          Toast.makeText(getBaseContext(), "btn2", Toast.LENGTH_LONG).show();


                          //Your Operation
                          break;
            }

        }}
3 голосов
/ 13 декабря 2015

Одна ошибка, которую я сделал, не включала "Implements OnClickListener" в объявление основного класса. Это пример кода, который наглядно иллюстрирует использование регистра переключателя при нажатии. Код меняет цвет фона согласно нажатой кнопке. Надеюсь, это поможет.

public class MainActivity extends Activity  implements OnClickListener{


TextView displayText;
Button cred, cblack, cgreen, cyellow, cwhite;
LinearLayout buttonLayout;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    cred = (Button) findViewById(R.id.bred);
    cblack = (Button) findViewById(R.id.bblack);
    cgreen = (Button) findViewById(R.id.bgreen);
    cyellow = (Button) findViewById(R.id.byellow);
    cwhite = (Button) findViewById(R.id.bwhite);
    displayText = (TextView) findViewById(R.id.tvdisplay);
    buttonLayout = (LinearLayout) findViewById(R.id.llbuttons);

    cred.setOnClickListener(this);
    cblack.setOnClickListener(this);
    cgreen.setOnClickListener(this);
    cyellow.setOnClickListener(this);
    cwhite.setOnClickListener(this);
}

@Override
protected void onClick(View V){
    int id=V.getId();
    switch(id){
    case R.id.bred:
        displayText.setBackgroundColor(Color.rgb(255, 0, 0));
        vanishLayout();
        break;
    case R.id.bblack:
        displayText.setBackgroundColor(Color.rgb(0, 0, 0));
        vanishLayout();
        break;
    case R.id.byellow:
        displayText.setBackgroundColor(Color.rgb(255, 255, 0));
        vanishLayout();
        break;
    case R.id.bgreen:
        displayText.setBackgroundColor(Color.rgb(0, 255, 0));
        vanishLayout();
        break;
    case R.id.bwhite:
        displayText.setBackgroundColor(Color.rgb(255, 255, 255));
        vanishLayout();
        break;
    }
}
3 голосов
/ 05 июня 2012

Я обнаружил, что самый простой способ сделать это - установить onClick для каждой кнопки в xml

<Button
android:id="@+id/vrHelp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_menu_help"
android:onClick="helpB" />

и тогда вы можете сделать такой случай переключения вот так

  public void helpB(View v) {
    Button clickedButton = (Button) v;
    switch (clickedButton.getId()) {
      case R.id.vrHelp:
        dosomething...
        break;

      case R.id.coHelp:
        dosomething...
        break;

      case R.id.ksHelp:
        dosomething...
        break;

      case R.id.uHelp:
        dosomething...
        break;

      case R.id.pHelp:
        dosomething...
        break;
    }
  }
0 голосов
/ 09 февраля 2018

Я использую Butterknife с распределительным шкафом для обработки таких случаев:

    @OnClick({R.id.button_bireysel, R.id.button_kurumsal})
        public void onViewClicked(View view) {
            switch (view.getId()) {


                case R.id.button_bireysel:
 //Do something

                    break;
                case R.id.button_kurumsal:

     //Do something

                    break;

            }
        }

Но дело в том, что по умолчанию нет регистра, и оператор switch проваливается

...