OnClickListener () Android für mehrere Schaltflächen

82

Ich mache gerade eine einfache Taschenrechner-App für Android. Ich versuche, den Code so einzurichten, dass beim Drücken einer Zifferntaste der Taschenrechnerbildschirm mit dieser Nummer aktualisiert wird. Momentan mache ich das so.

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

Es funktioniert, aber ich schreibe denselben Code für jede einzelne Taste auf dem Taschenrechner. Wie Sie sich vorstellen können, ist es sehr überflüssig. Kann ich diesen Code trotzdem effizienter schreiben? Eine, bei der diese Methode nicht für jede einzelne Schaltfläche geschrieben wird?

user3011685
quelle
Wenn Sie den Onclick-Listener in Ihrer Klasse implementieren, wird die Onclick-Methode überschrieben. Basierend auf der Schaltflächen-ID können Sie Operationen ausführen
Lernender
Boopathi, können Sie mehr darüber erklären, wie ich dann den einen Knopf codieren würde? Ich habe die Schaltflächen-ID "1" so gemacht, dass ich mit "this" auf die Nummer zugreifen kann. Ich bin mir nicht sicher, wie ich dann die Textansicht bearbeiten würde.
user3011685

Antworten:

239

Sie müssen nur diese Schritte befolgen, um es einfach zu machen ...

Sie müssen nicht onClickListenerfür jeden neu schreiben Button... Implementieren View.OnClickListerSie einfach in Ihr Activity/ Fragment.. es wird eine neue Methode implementiert, die onClick()für die Behandlung von onClick-Ereignissen für Button, TextView` usw. aufgerufen wird.

  1. Implementieren Sie OnClickListener()in Ihrem Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Implementieren Sie die onClick () -Methode in Ihrer Aktivität / Ihrem 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()Für Schaltflächen implementieren
@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. Finden Sie Schaltflächen nach ID und implementieren Sie Ihren Code.
@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;
    }
}

Weitere Informationen finden Sie unter diesem Link:

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

Dies erleichtert die Handhabung vieler Schaltflächen-Klickereignisse und macht die Verwaltung einfach ...

Pragnesh Ghoda シ
quelle
Punkt 4: Ich erhalte eine Fehlermeldung am @ Override-Tag, die mich warnt, dass die Methode ihre Methode aus der Oberklasse nicht überschreibt.
KasparTr
@ user2984127 für welchen Fall? Verwenden Sie es mit Fragment oder Aktivität?
Pragnesh Ghoda
@ user2984127 Versuchen Sie, View.OnClickListener zu implementieren.
Pragnesh Ghoda シ
Ich habe diese Methode viele Male verwendet, während ich Eclipse verwendet habe, aber jetzt bin ich zu Android Studio gewechselt und erhalte die Fehlermeldung "Ressourcen-IDs können nicht in einer switch-Anweisung in Android-Bibliotheksmodulen verwendet werden.". Ab den SDK-Tools R14 sind die Ressourcen-IDs nicht endgültig. Die empfohlene Lösung besteht darin, den Switch durch if / else-Anweisungen zu ersetzen.
Skorpion
@ Scorpio: Ich benutze auch Android Studio. Aber ich habe diesen Fehler nie bekommen. Bitte überprüfen Sie, ob Sie die richtigen Methoden verwenden und mit der Verwendung erhalten view.getId()Sie die ID der angeklickten Schaltfläche. Dies ist ein Beispiel. Sie haben einige Änderungen vorgenommen, die von Ihren Anforderungen abhängen. Prost. :)
Pragnesh Ghoda
53

Sie können die Eigenschaft festlegen:

android:onClick="buttonClicked"

in der XML-Datei für jede dieser Schaltflächen und verwenden Sie diese im Java-Code:

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
    }

}
Andro
quelle
4
besser Schalter zu verwenden
Ali Khaki
1
@AliKhaki switchfunktioniert in einigen Fällen möglicherweise nicht. Hier erklärt: tools.android.com/tips/non-constant-fields
Andro
8

Setzen Sie auf jeder Schaltfläche ein Tag auf das, mit dem Sie arbeiten möchten, in diesem Fall wahrscheinlich eine Ganzzahl. Dann benötigen Sie nur einen OnClickListener für alle Ihre Schaltflächen:

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);
Henrik Christensen
quelle
1
Siehe auch diese Antwort auf die Verwendung von Tags für
Henrik Christensen
8

Ich habe eine dedizierte Klasse erstellt, die View.OnClickListener implementiert.

public class ButtonClickListener implements View.OnClickListener {

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

}

Dann habe ich eine Instanz dieser Klasse in MainActivity erstellt

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

und setzen Sie dann onClickListener für die Schaltfläche

btn.setOnClickListener(onClickBtnListener);
Vadim Novitskiy
quelle
Das funktioniert, aber wenn Sie mehr als eine Schaltfläche verwenden, rufen Sie immer denselben Listener auf. Fügen Sie Ihrer Methode onClick einen Switch-Fall mit der ID jeder Schaltfläche hinzu.
Lebarillier
Ich gehe davon aus, dass Sie eine Klasseninstanz pro Schaltfläche erstellen, die dieses Problem ebenfalls lindert
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);
        }
    }
}
KarelG
quelle
1

Ich hatte ein ähnliches Problem und habe Folgendes getan: Erstellen Sie eine Reihe von Schaltflächen

Button buttons[] = new Button[10];

Um dann auf Klick Listener zu implementieren und XML-IDs zu referenzieren, habe ich eine Schleife wie diese verwendet

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

Der Aufruf bleibt jedoch derselbe wie in Prags Antwortpunkt 4. PS: Wenn jemand eine bessere Methode hat, um alle onClick-Schaltflächen aufzurufen, kommentieren Sie dies bitte.

Akshit Agarwal
quelle
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;
    }
}
Sazidur Rahman
quelle
1

Sie können dies verwenden

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

Sie können die Ansichten in Ihrer Aktivität in einer separaten Methode identifizieren.

user3905781
quelle
1

Implementieren Sie die onClick () -Methode in Ihrer öffentlichen Klasse Activity / Fragment. MainActivity erweitert Activity implementiert 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..
    }
}
Vicky Mahale
quelle
0

Ich finde, dass die Verwendung einer langen if / else-Kette (oder eines Schalters) zusätzlich zur Liste von findViewById(btn).setOnClickListener(this)hässlich ist. Wie wäre es mit dem Erstellen neuer View.OnlickListener mit Override inline:

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
quelle
0

Keine Notwendigkeit, wenn sonst oder wechseln. Beginnen wir: Fügen Sie in jeder Schaltfläche oder was auch immer (ich verwende ImageView) dieses Attribut hinzu android:onClick="DoSomeThing"

In Ihrer Aktivität:

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
quelle
Auf diese Weise müssen Sie keine Ansichten anhand der ID finden, keine Klick-Listener, keinen redundanten Code, einfach wie oben!
Zubair Younas