50 Stimmen

Android Button setOnClickListener Design

Ich entwickle eine Android-Anwendung. Mir ist aufgefallen, dass ich viele Wiederholungen von ähnlichem Code in jeder meiner Klassen 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, wie ich alle diese Codes in etwas effizienter machen kann, so dass ich kann:

  1. Erstellen Sie das Schaltflächenobjekt {Button buttonX (Button)findViewById(R.id.buttonXName);}
  2. Den Hörer einstellen {buttonX.setOnClickListener(new OnClickListener()}
  3. Feststellen, ob sie angeklickt wurde {public void onClick(View v)}
  4. Dann einen spezifischen Code für jede Schaltfläche ausführen?

Wenn jemand etwas weiß, wäre ich dankbar.

1 Stimmen

Pruebe Kotlin

57voto

dgmltn Punkte 3725

Wenn Sie auf 1.6 oder höher abzielen, können Sie die Android:onClick xml-Attribut um einen Teil des sich wiederholenden Codes zu entfernen. Siehe dieser Blogbeitrag von Romain Guy.

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

Und in der Java-Klasse verwenden Sie die folgenden Codezeilen:

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

28voto

Squonk Punkte 48341

Implementieren Sie OnClickListener() auf Ihrer Activity...

public class MyActivity extends Activity implements View.OnClickListener {
}

Verwenden Sie für jede Taste...

buttonX.setOnClickListener(this);

Testen Sie in der onClick()-Methode Ihrer Aktivität, 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 zu erhalten, und diese dann in einem switch/case-Block verwenden, um jede Schaltfläche zu identifizieren und die entsprechende Aktion auszuführen.

14voto

Ilya Gazman Punkte 29734

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

11voto

Jim Blackler Punkte 22453

Seit setOnClickListener ist definiert für View no Button Wenn Sie die Variable nicht für etwas anderes benötigen, können Sie sie etwas kürzer fassen, etwa so:

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

6voto

Wesagn Punkte 61

Sie können Array verwenden, um mehrere Tastenklick-Listener in Android wie folgt zu behandeln: Hier bin ich Einstellung Taste klicken Listener für n Tasten mit Array als:

Button btn[] = new Button[n]; 

ANMERKUNG: n ist eine konstante positive ganze Zahl

Code-Beispiel:

//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, mailen Sie bitte an: wesagnd@yahoo.com

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X