Android Button setOnClickListener Design

Lesezeit: 5 Minuten

Benutzer-Avatar
Benutzer591162

Ich baue eine Android-Anwendung. Mir ist aufgefallen, dass ich in jedem meiner Kurse viele Wiederholungen von ähnlichem Code erstelle:

Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
    public void onClick(View v)
    {
        //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

Ich habe jetzt fünfzehn Schaltflächen und das macht meinen Code hässlich. Hat jemand eine Klasse oder einige Beispiele dafür, wie ich all diese Codes in etwas Effizienteres umwandeln kann, damit ich:

  1. Erstellen Sie das Schaltflächenobjekt {Button buttonX (Button)findViewById(R.id.buttonXName);}
  2. Stellen Sie den Zuhörer ein {buttonX.setOnClickListener(new OnClickListener()}
  3. Stellen Sie fest, ob darauf geklickt wurde {public void onClick(View v)}
  4. Dann einen bestimmten Code für jede Schaltfläche ausführen?

Wenn jemand etwas weiß, würde ich es schätzen.

  • Versuchen Kotlin

    – Tschelidze

    11. Oktober 2016 um 19:19 Uhr

Benutzer-Avatar
dgmltn

Wenn Sie auf 1.6 oder höher abzielen, können Sie die verwenden android:onClick-XML-Attribut um einen Teil des sich wiederholenden Codes zu entfernen. Sehen diesen Blogbeitrag von Romain Guy.

<Button 
   android:height="wrap_content"
   android:width="wrap_content"
   android:onClick="myClickHandler" />

Verwenden Sie in der Java-Klasse die folgenden Codezeilen:

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}

  • Vielen Dank. Dies ist die perfekte Lösung.

    – Benutzer591162

    8. April 2011 um 0:16 Uhr

  • seltsam, das hat mit meinem Dialog nicht funktioniert. Ich habe eine Ausnahme erhalten, die besagt, dass der Handler nicht existiert, aber ich habe den Handler definitiv definiert!

    – Irgendwer irgendwo

    7. Oktober 2011 um 21:27 Uhr


  • @SomeoneSomewhere Ich denke, es sucht die Ansicht im Aktivitätskontext. Handler sind aus dem Spiel.

    – Ilja Gazman

    27. Juni 2014 um 13:01 Uhr

  • @dgmltn ist es eine gute Praxis, die Ansicht über Aktivitätsinterna zu informieren?

    – Tschelidze

    11. Oktober 2016 um 19:18 Uhr

  • Wunderbar! Vielen Dank. Lambda-Code und Inline-Funktionen sind für einen alten Mann wie mich schwer zu lesen.

    – Eric M

    29. März 2021 um 19:34 Uhr

Benutzer-Avatar
Squonk

Implementieren Sie OnClickListener() in Ihrer Aktivität …

public class MyActivity extends Activity implements View.OnClickListener {
}

Für jede Tastenbetätigung…

buttonX.setOnClickListener(this);

Testen Sie in Ihrer Activity onClick()-Methode, um welche Schaltfläche es sich handelt …

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}

Auch in onClick könnten Sie view.getId() verwenden, um die Ressourcen-ID abzurufen, und diese dann in einem switch/case-Block verwenden, um jede Schaltfläche zu identifizieren und die entsprechende Aktion auszuführen.

  • Ist das wirklich eine Verbesserung?

    – Corey Sunwold

    8. April 2011 um 0:02 Uhr

  • @Corey Sunwold: Es ist alles ziemlich subjektiv, aber mit setOnClickListener(this); ist viel weniger hässlich und reduziert den Teil des Codes zur Erstellung von Schaltflächen, da keine onClick()-Inline-Deklarationen vorhanden sind. Wenn Sie nur einen onCLick()-Codeblock haben und insbesondere einen Switch/Case-Codeblock verwenden, um zu identifizieren, welche Schaltfläche gedrückt wird, wird ein einfacher Test in einem separaten Bereich des Hauptcodes durchgeführt. Darüber hinaus könnte jeder „Fall“ einfach eine Methode in einer „Hilfs“-Klasse aufrufen, die sich woanders befindet. Ich kann mir ein oder zwei andere Möglichkeiten vorstellen, Dinge zu tun, aber der Code muss noch irgendwo hin.

    – Squonke

    8. April 2011 um 0:29 Uhr

  • Squonk: Das macht mehr Sinn, ich hatte es nicht vom Standpunkt der Testbarkeit aus betrachtet (wahrscheinlich hätte ich es tun sollen). Vielen Dank.

    – Corey Sunwold

    8. April 2011 um 14:57 Uhr

Benutzer-Avatar
Ilja Gazman

Android Lambada-Lösung

public void registerButtons(){
    register(R.id.buttonName1, ()-> {/*Your code goes here*/});
    register(R.id.buttonName2, ()-> {/*Your code goes here*/});
    register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}

private void register(int buttonResourceId, Runnable r){
    findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}

Switch-Case-Lösung Lösung

public void registerButtons(){
    register(R.id.buttonName1);
    register(R.id.buttonName2);
    register(R.id.buttonName3);
}

private void register(int buttonResourceId){
    findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}

private OnClickListener buttonClickListener = new OnClickListener() {

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.buttonName1:
                // TODO Auto-generated method stub
                break;
            case R.id.buttonName2:
                // TODO Auto-generated method stub
                break;
            case View.NO_ID:
            default:
                // TODO Auto-generated method stub
                break;
        }
    }
};

Seit setOnClickListener definiert ist View nicht Buttonwenn Sie die Variable nicht für etwas anderes benötigen, können Sie es so etwas knapper machen:

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

Benutzer-Avatar
Wesagn

Sie können Array verwenden, um mehrere Schaltflächen-Klick-Listener in Android wie folgt zu handhaben: Hier stelle ich Schaltflächen-Klick-Listener für n Schaltflächen ein, indem ich Array wie folgt verwende:

Button btn[] = new Button[n]; 

HINWEIS: n ist eine konstante positive Ganzzahl

Codebeispiel:

//class androidMultipleButtonActions 
package a.b.c.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class androidMultipleButtonActions extends Activity implements OnClickListener{
    Button btn[] = new Button[3];

    public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        btn[0] = (Button) findViewById(R.id.Button1);
        btn[1] = (Button) findViewById(R.id.Button2);
        btn[2] = (Button) findViewById(R.id.Button3);
        for(int i=0; i<3; i++){
            btn[i].setOnClickListener(this);
        }           
    }

    public void onClick(View v) {
        if(v == findViewById(R.id.Button1)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button2)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button3)){
            //do here what u wanna do.
        }
    }
}

Hinweis: Schreiben Sie zuerst eine main.xml-Datei, wenn Sie nicht wissen, wie man schreibt, senden Sie bitte eine E-Mail an: [email protected]

Benutzer-Avatar
Gemeinschaft

Ich denke, Sie können normalerweise das, was Sie brauchen, in einer Schleife tun, was viel besser ist als viele onClick Methoden, wenn es möglich ist.

Sehen Sie sich diese Antwort an, um zu demonstrieren, wie Sie eine Schleife für ein ähnliches Problem verwenden. Wie Sie Ihre Schleife konstruieren, hängt von den Bedürfnissen Ihrer ab onClick Funktionen und wie ähnlich sie einander sind. Das Endergebnis ist viel weniger sich wiederholender Code, der einfacher zu warten ist.

Benutzer-Avatar
yatin deokar

Implementieren Sie Aktivität mit View.OnClickListener Wie unten.

public class MyActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_options);

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}

1101030cookie-checkAndroid Button setOnClickListener Design

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy