2017-08-25 4 views
-1

Ich bin verwirrt über verschiedene Verwendungen von setOnClickListener in einer Aktivität Schaltflächenaktionen. Ich habe verschiedene Lösungen gefunden, aber ich bin mir sicher, dass es einige beste/schlechtere Ansätze gibt, um es zu implementieren und auch einige "weil".Best Practice für Schaltflächen setOnClickListeners

Ich würde (als Subjekt) verstehen, welche der beste Ansatz ist und welche (und warum) nicht sind.

  1. Anruf eine private Funktion in Aktivität (Klasse) und den Hörer gesetzt und alle wirft darin:

    public class MainActivity extends AppCompatActivity { 
        Private Button myButton; 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         OnClickButton(); 
        } 
        private void OnClickButton(){ 
         myButton = (Button)findViewById(R.id.Button1); 
         myButton.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // button actions 
         } 
    
         }); 
        } 
    } 
    
  2. setzen eine setOnClickListener in Aktivität und dann entsprechende Funktion aufrufen: (In diesem Fall ich weiß nicht auch verstehen, warum die Ansicht als letzte in onClick definiert ist)

    public class MainActivity extends AppCompatActivity { 
        Private Button myButton; 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         myButton.setOnClickListener(onClickListener); 
        } 
        private OnClickListener onClickListener = new OnClickListener() { 
         @Override 
         public void onClick(final View v) { 
         // button actions 
         } 
        } 
    
  3. einfach ein sa Funktion mit dem Argument myView durch die Funktion in XML-Datei verknüpfen:

ON MAINACTIVITY.XML ADD:

android:onClick="onButtonClick" 

ON MAINACTIVITYCLASS:

public class MainActivity extends AppCompatActivity { 
     Private Button myButton; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
     } 
     public void onButtonClick(View v){ 
      // button actions 
     } 
    } 

HINWEIS: Ich fand (Notwendigkeit comfirms) Dieser 3 ° Weg ist keine gute Übung, da er nicht in Framesets unterstützt wird.

Wenn Sie eine stärker codierte Lösung haben, fügen Sie sie hinzu.

Bitte versuchen Sie, die guten Praktiken und die Unterschiede in der Praxis zu beseitigen, und warum etwas richtiger ist oder stattdessen eine schlechte Lösung ist.

In der Hoffnung, dies könnte für andere Menschen nützlich sein, Ich schrieb diesen Beitrag auch, weil viele Post, die ich las, sehr alt waren. Danke.

+1

https://stackoverflow.com/questions/30082892/best-way-to-implement-view-onclicklistener-in-android –

+0

Besuch hier schon answerd. https://stackoverflow.com/questions/30082892/best-way-to-implement-view-onclicklistener-in-android –

+0

Ich las diesen Beitrag und versuchte zu erstellen: öffentliche Klasse ActivityMain erweitert Aktivität implementiert View.OnClickListener .. . .aber ich hatte einen Fehler: "Klasse" MainActivity "muss entweder abstrakt erklärt werden oder abstrakte Methode 'onClick (view)' in 'OnClickListener' implementieren – Marco

Antwort

0

Ich empfehle die Verwendung von Butterknife-Bibliothek für Bindungen und OnClick-Methoden. Meiner Meinung nach ist es am klarsten, es zu definieren.

butter: http://jakewharton.github.io/butterknife/

Beispiele:

@OnClick(R.id.submit) 
public void sayHi(Button button) { 
    button.setText("Hello!"); 
} 


@OnClick({ R.id.door1, R.id.door2, R.id.door3 }) 
public void pickDoor(DoorView door) { 
    if (door.hasPrizeBehind()) { 
     Toast.makeText(this, "You win!", LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(this, "Try again", LENGTH_SHORT).show(); 
    } 
} 
+1

Tank Sie für Vorschlag, ich werde diese Lösung sehen, aber ich würde es bevorzugen, die Grundlagen zu verstehen von Android-Studio-Bibliotheken, vor der Implementierung neuer. – Marco

0

Ich ziehe Einstellverfahren für OnClick in XML-Layout und Definieren Schalterblock verschiedene Ereignisse auf der Grundlage ID zu handhaben. Diese Methode ist besser lesbar und leistungsfähiger als die Verwendung mehrerer anonymer innerer Klassen.

public class MainActivity extends AppCompatActivity { 
Private Button myButton; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 
public void onButtonClick(View v) 
    { 
     int id = v.getId(); 
     switch(id) 
     { 
      case R.id.signinbutton: signin();break; 
      case R.id.logoutbutton: logout();break; 
     } 
    } 
} 
+0

Ich lese, dass mit xml-Methode wird nicht von framsest unterstützt, können Sie dies bestätigen? Ich brauche framesets. – Marco

+1

@Marco beim Laden von HTML in Android dann Android unterstützt Frameset, die in HTML ist . –