OnClickListener () с несколькими кнопками android

85

Сейчас я делаю простой калькулятор для Android. Я пытаюсь настроить код, чтобы при нажатии цифровой кнопки он обновлял экран калькулятора с этим номером. Сейчас делаю вот так.

    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView output = (TextView) findViewById(R.id.output);
            output.append("1");
        }
    });

Это работает, но я пишу один и тот же код для каждой кнопки калькулятора. Как вы понимаете, это очень избыточно. Можно ли как-нибудь написать этот код более эффективным способом? Тот, который не предполагает написания этого метода для каждой кнопки?

user3011685
источник
реализуйте прослушиватель onclick в своем классе, он переопределит метод onclick. На основе идентификатора кнопки вы можете выполнять операции
учащийся
Бупати, не могли бы вы объяснить, как я тогда закодировал бы одну кнопку? Я сделал кнопку id "1" таким образом, чтобы я мог использовать "this" для доступа к номеру. Я не уверен, как бы потом отредактировать TextView.
user3011685

Ответы:

242

Вам просто нужно выполнить следующие шаги, чтобы упростить ...

Вам не нужно писать новый onClickListenerдля Every Button... Просто внедрите View.OnClickListerв свой Activity/ Fragment.. он будет реализовывать новый метод, вызываемый onClick()для обработки событий onClick для Button, TextView` и т. Д.

  1. Реализуйте OnClickListener()в своем Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Реализуйте метод onClick () в своем действии / фрагменте
public class MainActivity extends Activity implements View.OnClickListener {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public void onClick(View v) {
      // default method for handling onClick Events..
    }
}
  1. Инструмент OnClickListener()для кнопок
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.your_layout);
    
    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(this); // calling onClick() method
    Button two = (Button) findViewById(R.id.twoButton);
    two.setOnClickListener(this);
    Button three = (Button) findViewById(R.id.threeButton);
    three.setOnClickListener(this);
}
  1. Найдите кнопки по идентификатору и внедрите свой код ..
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.oneButton:
            // do your code
            break;
        case R.id.twoButton:
            // do your code
            break;
        case R.id.threeButton:
            // do your code
            break;
        default:
            break;
    }
}

Пожалуйста, перейдите по этой ссылке для получения дополнительной информации:

https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (обновлено)

Это упростит обработку многих событий нажатия кнопок и упростит управление ...

Прагнеш Года シ
источник
Пункт 4: я получаю сообщение об ошибке в теге @Override, которое предупреждает меня, что метод не переопределяет свой метод из суперкласса.
KasparTr
@ user2984127 в каком случае? вы используете его с фрагментом или активностью?
Pragnesh Ghoda シ
@ user2984127 попробуйте реализовать View.OnClickListener.
Pragnesh Ghoda シ
Я использовал этот метод много раз при использовании Eclipse, но теперь я переключился на Android Studio и получил сообщение об ошибке «Идентификаторы ресурсов нельзя использовать в операторе переключения в модулях библиотеки Android.». Что касается инструментов SDK R14, идентификаторы ресурсов не являются окончательными. Рекомендуемое исправление - заменить переключатель операторами if / else.
Скорпион,
@Scorpio: Я тоже использую студию Android. Но я никогда не получал этой ошибки. Пожалуйста, убедитесь, что вы используете правильные методы и view.getId()получаете ли вы идентификатор нажатой кнопки. Это пример, вы можете внести некоторые изменения в зависимости от ваших потребностей. Ура. :)
Pragnesh Ghoda シ 08
53

Вы можете установить свойство:

android:onClick="buttonClicked"

в XML-файле для каждой из этих кнопок и используйте это в Java-коде:

public void buttonClicked(View view) {

    if (view.getId() == R.id.button1) {
        // button1 action
    } else if (view.getId() == R.id.button2) {
        //button2 action
    } else if (view.getId() == R.id.button3) {
        //button3 action
    }

}
Андро
источник
4
лучше использовать переключатель
Али Хаки
1
@AliKhaki switchможет не работать в некоторых случаях. Объяснение здесь: tools.android.com/tips/non-constant-fields
Андро
8

Установите тег для каждой кнопки на то, с чем вы хотите работать, в данном случае, вероятно, на целое число. Тогда вам понадобится только один OnClickListener для всех ваших кнопок:

Button one = (Button) findViewById(R.id.oneButton);
Button two = (Button) findViewById(R.id.twoButton);
one.setTag(new Integer(1));
two.setTag(new Integer(2));

OnClickListener onClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        TextView output = (TextView) findViewById(R.id.output);
        output.append(v.getTag());
    }
}

one.setOnClickListener(onClickListener);
two.setOnClickListener(onClickListener);
Хенрик Кристенсен
источник
1
См. Также этот ответ о том, для чего использовать теги
Хенрик Кристенсен
8

Я создал специальный класс, реализующий View.OnClickListener.

public class ButtonClickListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
    }

}

Затем я создал экземпляр этого класса в MainActivity

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

а затем установите onClickListener для кнопки

btn.setOnClickListener(onClickBtnListener);
Вадим Новицкий
источник
это работает, но если вы используете более одной кнопки, вы всегда будете вызывать один и тот же Listener, вам следует добавить случай переключения в свой метод onClick с идентификатором каждой кнопки.
lebarillier 05
Я предполагаю, что если вы создадите экземпляр класса для каждой кнопки, это также уменьшит эту проблему,
Мэтт Стром,
3
public class MainActivity extends AppCompatActivity implements OnClickListener  {
    Button  b1,b2;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1= (Button) findViewById(R.id.button);
        b2= (Button) findViewById(R.id.button2);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
    }


    @Override
    public void onClick(View v)
    {
        if(v.getId()==R.id.button)
        {
            Intent intent=new Intent(getApplicationContext(),SignIn.class);
            startActivity(intent);
        }
        else if (v.getId()==R.id.button2)
        {
            Intent in=new Intent(getApplicationContext(),SignUpactivity.class);
            startActivity(in);
        }
    }
}
КарелГ
источник
1

У меня была аналогичная проблема, и я сделал следующее: создал массив кнопок.

Button buttons[] = new Button[10];

Затем для реализации прослушивателя кликов и ссылки на идентификатор xml я использовал такой цикл

for (int i = 0; i < 10; i++) {      
String buttonID = "button" + i;
        int resID = getResources().getIdentifier(buttonID, "id",
                "your package name here");
        buttons[i] = (Button) findViewById(resID);
        buttons[i].setOnClickListener(this);
    }

Но их вызов остается таким же, как и в пункте 4 ответа Prag. PS - Если у кого-то есть лучший способ вызвать все кнопки onClick, прокомментируйте, пожалуйста.

Акшит Агарвал
источник
1
public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case R.id.button1:
            //do ur code
            Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show();
            break;
        case R.id.button2:
            Intent intent = new Intent(this,SecondActivity.class);
            Intent.putExtra("key",value);
            startActivity(intent);
            break;
        case R.id.button3:
            //do ur code
            break;
        case R.id.button4:
            //do ur code;
            break;
        default:
            //do ur code;
    }
}
Сазидур Рахман
источник
1

Вы можете использовать это

    TextView output = (TextView) findViewById(R.id.output);
    one.setOnClickListener(youractivity.this);
    // set the onclicklistener for other buttons also

    @Override
    public void onClick(View v) {
      int id = v.getId();
    switch(id) {
    case R.id.oneButton:      
       append("1",output);
       break;
    case R.id.twoButton:
        append("2",output);
       break;
    case R.id.threeButton:
        append("3",output);
       break;
     } 
      }

 private void append(String s,TextView t){
  t.setText(s); 
}

вы можете идентифицировать просмотры в своей деятельности отдельным методом.

user3905781
источник
1

Реализуйте метод onClick () в своем общедоступном классе Activity / Fragment MainActivity extends Activity реализует View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onClick(View v) {
 switch (itemId) {

// if you call the fragment with nevigation bar then used.

           case R.id.nav_menu1:
                fragment = new IntroductionFragment();
                break;

// if call activity with nevigation bar then used.

            case R.id.nav_menu6:
                Intent i = new Intent(MainActivity.this, YoutubeActivity.class);
                startActivity(i);
      // default method for handling onClick Events..
    }
}
Вики Махале
источник
0

Я считаю, что использование длинной цепочки if / else (или переключателя) в дополнение к списку findViewById(btn).setOnClickListener(this)некрасиво. как насчет создания нового View.OnlickListeners с переопределением, встроенным:

findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signIn(); }});
findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { signOut(); }});
findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { decryptThisTest(); }});
findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBookTickers(); }});
findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener()
    { @Override public void onClick(View v) { getBalances(); }});
Mholberger
источник
0

Нет необходимости в if else или переключателе, давайте начнем: в каждой вашей кнопке или чем-то еще (я использую ImageView) добавьте этот атрибут android:onClick="DoSomeThing"

В вашей деятельности:

public void DoSomeThing(View v){
    ImageView img1= (ImageView) v; //you have to cast the view i.e. if it's button, it must be cast to Button like below line

    Button b1= (Button) v;

    img1.setImageBitmap(imageBitmap); //or anything you want to do with your view, This will work for all

    b1.setText("Some Text");
 

}
Зубаир Юнас
источник
Таким образом, не нужно искать представления по идентификатору, нет прослушивателей кликов, нет избыточного кода, все просто, как указано выше!
Зубайр Юнас