Кілька кнопок 'OnClickListener () android


83

Зараз я роблю простий додаток для калькулятора на 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");
        }
    });

Це працює, але я пишу цей самий код для кожної кнопки на калькуляторі. Як ви можете собі уявити, це дуже зайве. Чи можу я якось написати цей код більш ефективно? Той, який передбачає не написання цього методу для кожної кнопки?


застосуйте слухач onclick у своєму класі, він замінить метод onclick. На основі ідентифікатора кнопки ви можете робити операції
учень

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

Відповіді:


240

Вам просто потрібно виконати ці кроки, щоб полегшити ...

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

  1. Впровадити OnClickListener()у своєму Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Реалізуйте метод onClick () у своєму Activity / Fragment
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 для якого випадку? ви використовуєте його з фрагментом чи активністю?
Прагнеш Года, シ

@ user2984127 спробуйте впровадити View.OnClickListener.
Pragnesh Ghoda,

Я використовував цей метод багато разів під час використання Eclipse, але тепер я перейшов на Android Studio, і з'являється повідомлення про помилку "Ідентифікатори ресурсів не можуть використовуватися в операторі перемикання в модулях бібліотеки Android." Що стосується інструментів SDK R14, ідентифікатори ресурсів не є остаточними. Рекомендується виправити заміну комутатора на оператори if / else.
Скорпіон

@Scorpio: Я теж використовую андроїд-студію. Але я ніколи не отримував цієї помилки. Будь ласка, перевірте, чи використовуєте ви належні методи, і при використанні view.getId()ви отримуєте ідентифікатор натиснутої кнопки. Це приклад, ви внесли деякі зміни залежно від ваших потреб. Ура. :)
Прагнеш Года シ

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може не працювати в деяких випадках. Пояснено
Андро,

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);

це працює, але якщо ви використовуєте більше однієї кнопки, ви будете викликати завжди одного і того ж слухача, вам слід додати регістр комутатора у своєму методі onClick з ідентифікатором кожної кнопки.
lebarillier

Я припускаю, що якщо ви створите екземпляр класу за кнопкою, який також полегшить цю проблему
Метт Стром,

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);
    }

Але їх виклик залишається таким же, як у пункті відповіді Prag 4. 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); 
}

Ви можете визначити погляди у своїй діяльності окремим методом.


1

Реалізуйте метод onClick () у вашому відкритому класі Activity / Fragment MainActivity розширює Activity implements 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(); }});

0

Не потрібно, якщо ще чи перемикач, почнемо: Додайте цей атрибут у кожну вашу кнопку або що завгодно (я використовую 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");
 

}

Таким чином, не потрібно знаходити подання за ідентифікатором, не слухати кліки, не зайвий код, простий, як зазначено вище!
Zubair Younas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.