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:
Erstellen Sie das Schaltflächenobjekt {Button buttonX (Button)findViewById(R.id.buttonXName);}
Stellen Sie den Zuhörer ein {buttonX.setOnClickListener(new OnClickListener()}
Stellen Sie fest, ob darauf geklickt wurde {public void onClick(View v)}
Dann einen bestimmten Code für jede Schaltfläche ausführen?
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.
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
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.
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}
}
});
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]
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.
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;
}
}
}
Versuchen Kotlin
– Tschelidze
11. Oktober 2016 um 19:19 Uhr