Wiele przycisków OnClickListener () android


85

Obecnie tworzę prostą aplikację kalkulatora na Androida. Próbuję ustawić kod tak, aby po naciśnięciu przycisku numerycznego aktualizował ekran kalkulatora o ten numer. Obecnie robię to w ten sposób.

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

Działa, ale piszę ten sam kod dla każdego przycisku kalkulatora. Jak możesz sobie wyobrazić, jest to bardzo zbędne. Czy mimo wszystko mogę napisać ten kod w bardziej efektywny sposób? Taki, który polega na tym, że nie pisze się tej metody dla każdego przycisku?


zaimplementuj odbiornik onclick w swojej klasie, zastąpi on metodę onclick. na podstawie identyfikatora przycisku możesz wykonywać operacje
uczeń

Boopathi, czy możesz wyjaśnić więcej na temat kodowania jednego przycisku? Ustawiłem identyfikator przycisku „1” w ten sposób, że mogę użyć „this”, aby uzyskać dostęp do numeru. Nie jestem jednak pewien, jak następnie edytować TextView.
user3011685

Odpowiedzi:


242

Po prostu musisz wykonać następujące kroki, aby ułatwić ...

Nie musisz pisać nowego onClickListenerdla Every Button... Po prostu zaimplementuj View.OnClickListerw Activity/ Fragment.. zaimplementuje nową metodę o nazwie onClick()do obsługi zdarzeń onClick dla Button, TextView` itp.

  1. Zaimplementuj OnClickListener()w swoim Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Zaimplementuj metodę onClick () w swoim działaniu / fragmencie
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. Zaimplementuj OnClickListener()do przycisków
@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. Znajdź przyciski według identyfikatora i zaimplementuj swój kod.
@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;
    }
}

Więcej informacji można znaleźć pod tym linkiem:

https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (zaktualizowany)

Ułatwi to obsługę wielu zdarzeń związanych z kliknięciami przycisków i sprawi, że zarządzanie nimi będzie proste ...


Punkt 4: Otrzymuję błąd na tagu @Override, który ostrzega mnie, że metoda nie zastępuje swojej metody z nadklasy.
KasparTr

@ user2984127 w jakim przypadku? czy używasz go z fragmentem lub aktywnością?
Pragnesh Ghoda シ

@ user2984127 spróbuj zaimplementować View.OnClickListener.
Pragnesh Ghoda シ

Korzystałem z tej metody wiele razy podczas korzystania z Eclipse, ale teraz przełączam się na Android Studio i pojawia się błąd „Identyfikatory zasobów nie mogą być używane w instrukcji przełącznika w modułach biblioteki systemu Android.”. Począwszy od narzędzi SDK R14, identyfikatory zasobów nie są ostateczne. Zalecaną poprawką jest zastąpienie przełącznika instrukcjami if / else.
Scorpio,

@Scorpio: Ja też używam Android Studio. Ale nigdy nie dostałem tego błędu. Sprawdź, czy korzystasz z odpowiednich metod i przy użyciu view.getId()otrzymujesz identyfikator klikniętego przycisku. To jest przykład, dokonałeś pewnych zmian w zależności od potrzeb. Twoje zdrowie. :)
Pragnesh Ghoda シ

53

Możesz ustawić właściwość:

android:onClick="buttonClicked"

w pliku xml dla każdego z tych przycisków i użyj tego w kodzie 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
lepiej użyć przełącznika
Ali Khaki

1
switchW niektórych przypadkach @AliKhaki może nie działać. Wyjaśniono tutaj: tools.android.com/tips/non-constant-fields
Andro

8

Ustaw znacznik na każdym przycisku na cokolwiek, z czym chcesz pracować, w tym przypadku prawdopodobnie na liczbę całkowitą. Wtedy potrzebujesz tylko jednego OnClickListener dla wszystkich swoich przycisków:

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
Zobacz także tę odpowiedź na temat tego, do czego używać tagów
Henrik Christensen,

8

Stworzyłem dedykowaną klasę, która implementuje View.OnClickListener.

public class ButtonClickListener implements View.OnClickListener {

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

}

Następnie utworzyłem wystąpienie tej klasy w MainActivity

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

a następnie ustaw onClickListener dla przycisku

btn.setOnClickListener(onClickBtnListener);

to działa, ale jeśli używasz więcej niż jednego przycisku, będziesz wywoływał zawsze ten sam Listener, powinieneś dodać przypadek przełącznika w swojej metodzie onClick z identyfikatorem każdego przycisku.
lebarillier

Zakładam, że jeśli utworzysz instancję klasy na przycisk, który również złagodzi ten problem
Matt Strom

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

Miałem podobny problem i zrobiłem: Utwórz tablicę przycisków

Button buttons[] = new Button[10];

Następnie, aby zaimplementować odbiornik kliknięć i odwołać się do identyfikatorów xml, użyłem takiej pętli

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

Ale wywołanie ich pozostaje takie samo jak w punkcie odpowiedzi Praga 4. PS- Jeśli ktoś ma lepszą metodę wywoływania wszystkich przycisków onClick, proszę o komentarz.


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

Możesz tego użyć

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

możesz zidentyfikować widoki w swojej działalności w oddzielnej metodzie.


1

Zaimplementuj metodę onClick () w swojej publicznej klasie Activity / Fragment MainActivity extends Activity implementuje 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

Uważam, że używanie długiego łańcucha if / else (lub przełącznika) oprócz listy findViewById(btn).setOnClickListener(this)jest brzydkie. co powiesz na utworzenie nowego View.OnlickListeners z nadpisaniem, w linii:

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

Nie ma potrzeby przełączania czy innego, zacznijmy: w każdym twoim przycisku lub cokolwiek to jest (używam ImageView), dodaj ten atrybut android:onClick="DoSomeThing"

W Twojej aktywności:

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

}

W ten sposób nie ma potrzeby wyszukiwania widoków według identyfikatora, żadnych odbiorników kliknięć, żadnego zbędnego kodu, proste jak powyżej!
Zubair Younas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.