Как использовать несколько кнопок и OnClickListeners - PullRequest
7 голосов
/ 13 апреля 2011

У меня есть в 16 Button с (числа, плюс, минус и т. Д.) В моем файле XML макета.

Мне интересно, как проверить, какая кнопка была нажата.

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

Есть ли более элегантный способ?

Ответы [ 6 ]

19 голосов
/ 13 апреля 2011

Вы можете работать со всеми ними в одном классе, который реализует OnClickListener, или в классе деятельности, если хотите ...

import android.view.View.OnClickListener;

   public class MyActivity extends Activity implements OnClickListener {

      @Override public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         Button buttonA = (Button) findViewById(R.id.buttonA);    
         buttonA.setOnClickListener(this);
         Button buttonB = (Button) findViewById(R.id.buttonB); 
         buttonB.setOnClickListener(this);
      }

   //etc... etc...

   public void onClick(View v) {

      switch (v.getId()) {
         case R.id.buttonA: 
          // do something
          break;
         case R.id.buttonB:
          // do something else
          break;
      }
   }

}
6 голосов
/ 13 апреля 2011

Вы можете использовать один обработчик, который вы не определяете как анонимный внутренний класс, но в отдельном классе.onClick() передаст представление и вы сможете выбрать его.

public class MyActivity implements OnClickListener {
    public void onClick(View v) {
       Button b = (Button)v;
       // do what you want 
    }

    ...
}

, а затем в файле layout.xml просто поместите для каждой кнопки

<Button android:id=".."
        android:onClick="onClick"
4 голосов
/ 13 апреля 2011

Конечно. Создайте массив ваших button-ids и назначьте им одного и того же слушателя (реализация View.OnClickListener - определенного как отдельный класс, а не как анонимный класс) в цикле. В слушателе вы можете проверить, какая кнопка нажата (сравнивая параметр view в методе onClick()).

В деятельности:

MyOnClickListener myListener = new MyOnClickListener();
for (int id : buttonIdArray)
    ((Button)findViewById(id)).setOnClickListener(myListener);

В методе onClick:

int id = view.getId();
switch (id)
{
case ...:
// Do stuff
case ...:
// Do different stuff
}
2 голосов
/ 27 декабря 2011
import android.view.View.OnClickListener;

public class MyActivity extends Activity implements OnClickListener {

  @Override public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     Button buttonA = (Button) findViewById(R.id.buttonA);    
     Button buttonB = (Button) findViewById(R.id.buttonB); 
     buttonA.setOnClickListener(this);
     buttonB.setOnClickListener(this);
  }

  public void onClick(View v) {
    if(v==buttonA)
    {
        do something...
    }
    if(v==buttonB)
    {
        do something...
    }
}
2 голосов
/ 13 апреля 2011

Вам не нужно упоминать 16 при прослушивании кликов. Создать один и прикрепить его к каждой кнопке. Метод onClick () получает View в качестве параметра. Этот вид - ваша кнопка. Просто проверьте его идентификатор или имя.

0 голосов
/ 02 июля 2015

Я обычно делаю что-то вроде этого:

@Override
public boolean onTouch(View v, MotionEvent event) 
{
    Button thisButton = (Button) v;


    switch (event.ACTION_DOWN)
    {
        case MotionEvent.ACTION_DOWN:
            for (int i = 0; i < _button.length;i++)

                if (tagOf(thisButton) == tagOf(_button[i]))
                {
                    System.out.println("Button " + i + " pressed!");
                    _textView[i].setText(String.valueOf(_settingBrowser.countUpPosition(i)));
                }
    }
    return false;
}


int tagOf (Button b)
{
    return Integer.parseInt(b.getTag().toString());
}

Инициирование кнопок с идентификационным номером в основном классе, например:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    _button = new Button[FIELDS];


        _button[0] = (Button) findViewById(R.id.Button01);
        _button[1] = (Button) findViewById(R.id.Button02);
        _button[2] = (Button) findViewById(R.id.Button03);
        _button[3] = (Button) findViewById(R.id.Button04);
        _button[4] = (Button) findViewById(R.id.Button05);
        _button[5] = (Button) findViewById(R.id.Button06);


        _padListener = new SettingButtonListener(_button); 

        for (int j = 0; j < _button.length; j++){
            _button[j].setTag(j);
            _button[j].setOnTouchListener(_padListener);

        }
}

Это аккуратно, если у вас естьбольшое количество кнопок, как вы делаете и хотите использовать один и тот же слушатель для всех из них.Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...