OnClick Verständnis Problem

  • Antworten:3
Alexej D.
  • Forum-Beiträge: 10

06.02.2014, 15:51:26 via Website

Hallo zusammen,

mein Problem konnte ich dank der SuFu schon lösen. Ich würde aber gerne verstehen wo genau der Fehler lag.

Im Prinzip will ich einfach nur wenn ein Button gedrückt wird ein Text ausgeben.
Dafür habe ich folgenden Code benutzt:
1final Button antwort = (Button) findViewById(R.id.button1);
2 antwort.setText(R.string.antwort);
3 antwort.setOnClickListener(new View.OnClickListener() {
4 public void onClick(View view) {
5
6 Toast.makeText(this, "Wrong! Try again",Toast.LENGTH_SHORT).show();
7
8 }
9 });

Mir wurde dann dieser Fehler angezeigt,
Die Methode makeText(Context, CharSequence, int) im Typ Toast ist für die Argumente nicht anwendbar (new View.OnClickListener(){}, String, int)
den ich beheben konnte durch folgende Änderung
1Toast.makeText(MainActivity.this, "Wrong! Try again",Toast.LENGTH_SHORT).show();

Jetzt die erste Verständisfrage: Warum brauche ich das MainActivity davor? bezieht sich das this nicht sowieso auf genau die momentane Funktion der Klasse?

Ich habe dann im Internet recherchiert und eine alternative schreibweise gefunden. Dazu musste ich mein Button in der XML-Datei einen onClick hinzufügen:
1android:onClick="onClickButton1"
Danach sollte ich eigentlich auf den Klick im Programmm durch folgenden Code reagieren können:
1public void onClickButton1 (View view){
2Toast.makeText(this, "Wrong! Try again",
3Toast.LENGTH_SHORT).show();
4}
Hier wird mir jedoch als Fehler ausgegeben:
void ist ein ungültiger Typ für die Variable onClickButton1

Woran liegt das? Wo genau ist mein Fehler?

Ich würde mich freuen, wenn ihr mir meine Fragen beantworten könntet und vllt wäre es auch interessant zu erfahren welche Variante ihr wählt und warum.
Vielen Dank schon mal und beste Grüße
Alexej

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.02.2014, 16:01:43 via Website

Also ich bevorzuge die erste Variante, da ich so jeden ein OnClick Listener für jeden BTN habe.
Musst beim Toast einen Context angeben, mit getApplicationContext() macht man dies normal.
PS: nur mit den this geht das nicht, da das this sich auf die klasse bezieht in dem Fall der Listener

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
impjor
  • Forum-Beiträge: 1.793

06.02.2014, 18:36:31 via App

getApplicationContext() ist aber wirklich unschön.

Es ist halt so, dass du ein Objekt des Interfaces View.OnClickListener brauchst. Von einem Interface kann man aber keine Objekte erzeugen, sondern muss erst eine eigene Klasse schreiben, die die Methoden des Interfaces überschreibt (hier onClick) und kann dann von dieser Klasse Objekte erzeugen.
Eigentlich müsstest du jetzt eine neue Datei mit einer Klasse machen, die OnClickListener implementiert, also onClick(View v) mit Code füllt.
Stattdessen kannst du aber auch eine sog. anonyme Klasse erstellen. D.h. du erstellst ein Objekt von einer Klasse ohne Namen, die genau dort steht, wo das Objekt benötigt wird. Also in deinem Fall
OnClickListener listener = new OnClickListener() {
//Anonyme Klasse

void onClick(View v) {
//Code
}

}
);

Wenn dort drinnen nun this benutzt wird, bezieht sich das eben auf die aktuelle anonyme Klasse, super wäre entsprechen die Klasse OnClickListener und nicht Activity!

Zu der zweiten Variante müsstest du noch etwas mehr Code zeigen, damit man den Fehler sieht. Die finde ich aber persönlich am unschönsten. Entweder jeder Button nen eigenen OnClickListener (durch anonyme Klasse) oder alle Button einen OnClickListener zuweisen mit this (Activity muss dann das Interface OnClickListener implementieren), die dritte Möglichkeit ist ein Objekt von OnClickListener zu implementieren (s.o.) und dieses dann mehreren Buttons zuweisen.


LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Alexej D.
  • Forum-Beiträge: 10

08.02.2014, 23:24:44 via Website

Vielen Dank für diese lehrreichen Antworten.
So macht es wirklich Spaß weiter zu lernen :-)

Antworten