Ich habe die Aktivität:
public class Mtest extends Activity {
Button b1;
Button b2;
public void onCreate(Bundle savedInstanceState) {
...
b1 = (Button) findViewById(R.id.b1);
b2 = (Button) findViewById(R.id.b2);
b1.setOnClickListener(myhandler);
b2.setOnClickListener(myhandler);
...
}
View.OnClickListener myhandler = new View.OnClickListener() {
public void onClick(View v) {
// MY QUESTION STARTS HERE!!!
// IF b1 do this
// IF b2 do this
// MY QUESTION ENDS HERE!!!
}
}
}
Wie überprüfe ich, auf welche Schaltfläche geklickt wurde?
Antworten:
Sie werden auf einfache Weise lernen, wie es geht:
Wenn Sie nur mit einem Klicklistener arbeiten, haben Sie folgende Möglichkeiten:
Ich empfehle jedoch nicht, dies so zu tun, da Sie
if
für jede Schaltfläche, die Sie verwenden , eine hinzufügen müssen. Das ist schwer zu pflegen.quelle
View
ist nicht einButton
, aberButton
ist einView
. Sie können jedoch aView
zu a werfenButton
. Denken Sie daran, dass der zweite Weg nicht empfohlen wird ... Vielleicht ist v kein Button, der eine Cast-Ausnahme generiert.Oder Sie können das gleiche versuchen, aber ohne Zuhörer. Auf Ihrer Schaltfläche XML-Definition:
Und definieren Sie in Ihrem Code die Methode
ButtonOnClick
:quelle
if
Anweisungen und Listenern verwenden. Listener sind großartig, wenn Schaltflächen zur Laufzeit erstellt werden, aber das ist oft nicht der Fall.Fragment
s um die Ecke rau , da sich der Rückruf in der Aktivität befinden muss (nicht im Fragment).Ich bevorzuge:
Und dann:
Switch
-case
ist einfacher zu warten alsif
-else
und für diese Implementierung müssen nicht viele Klassenvariablen erstellt werden.quelle
Fünf Möglichkeiten, einen Ereignis-Listener zu verkabeln ist ein großartiger Artikel, in dem die verschiedenen Möglichkeiten zum Einrichten eines einzelnen Ereignis-Listeners beschrieben werden. Lassen Sie mich das hier für mehrere Hörer erweitern.
1. Mitgliedsklasse
2. Schnittstellentyp
3. Anonyme innere Klasse
4. Implementierung in Aktivität
5. Attribut im Ansichtslayout für OnClick-Ereignisse
Und in XML:
quelle
Wenn Sie keine Instanzen der Schaltfläche 2 im Klassencode speichern möchten, gehen Sie wie folgt BESSER vor (dies ist klarer und schneller !!):
quelle
Eine andere Möglichkeit ist ein einzelner Zuhörer aus einer Aktivität wie dieser:
Ich mache es gerne mit einer einzelnen ZF anstelle von switch-else, aber wenn Sie das bevorzugen, sollten Sie Folgendes tun:
quelle
Der beste Weg ist,
switch
zwischen v.getId () zu wechseln. Ein separater anonymer OnClickListener für jede Schaltfläche beansprucht mehr Speicher. Das Umwandeln der Ansicht in die Schaltfläche ist nicht erforderlich. Die Verwendung von if-else, wenn ein Wechsel möglich ist, ist langsamer und schwerer zu lesen. In der Android-Quelle können Sie häufig feststellen, dass Sie die Referenzen mit if-else vergleichen:Ich weiß nicht genau, warum sie diesen Weg gewählt haben, aber es funktioniert auch.
quelle
benutze setTag ();
so was:
quelle
Zusätzlich zur Antwort von Cristian C (Entschuldigung, ich kann keine Kommentare abgeben) können Sie v direkt mit b1 und b2 vergleichen, wenn Sie einen Handler für beide Schaltflächen erstellen, oder wenn Sie anhand der ID vergleichen möchten Sie müssen v nicht in Button umwandeln (View hat auch die Methode getId ()), und auf diese Weise besteht keine Sorge vor einer Cast-Ausnahme.
quelle
quelle
Weitere Informationen finden Sie in diesem Artikel
quelle