OnCLick für unterschiedliche Views????

  • Antworten:26
Tom-Oliver Dick
  • Forum-Beiträge: 15

25.03.2014, 17:35:52 via Website

Guten Tag Entwickler,
Ich bin gerade dabei ein kleines Spiel zu programmieren (Betonung liegt auf klein )
In diesem Spiel spawne ich Fische in einem FrameLayout. Wenn man einen dieser Fische angklickt soll je nach Fish der Score um 25, 100 oder 500 Punkte steigen. Ich habe den OnClickListener bereits implementiert, die OnClick Methode sieht wie folgt aus:
1@Override
2 public void onClick(View fish25) {
3 caughtfish25 ++;
4 scoreopps ();
5 refreshscreen ();
6 playplace.removeView(fish25);
7 }

Wenn nun der fish25 angeklickt wird soll der Wert der gefangenden Fische um 1 steigen.
Leider fühlen sich nicht nur die Fish25iger angesprochen sondern die Fish100 und Fish500 fügen zum Score auch jeweils 25 dazu.
Wie kann ich es anstellen, das in dieser OnClick Methode sich nur der Fish25 angesprochen fühlt?

T.-O.

Vielen Dank

Antworten
impjor
  • Forum-Beiträge: 1.793

25.03.2014, 17:46:53 via Website

Zwei Möglichkeiten:
  • Du erkennst in der OnClick-Methode anhand des View-Parameters, welcher Fisch geklickt wurde, z.B. anhand der ID oder anhand eines Tags. Das könnte so aussehen:
    1//In der Klasse
    2private static final int FISCH_TAG = 7845;
    3//irgendwo:
    4ImageView fisch = new ImageView();
    5[...]
    6fisch.setTag(FISCH_TAG, 25); //Für 25er-Fisch oder
    7fisch.setTag(FISCH_TAG, 50); //Für 50er-Fisch
    8
    9//In der onClick:
    10int tag = fish25.getTag(FISCH_TAG);
    11if (tag == 25) [...]
    12else if (...)
    Das ist die bessere Variante.
  • Irgendwo hast du dem Fisch bzw. der View den OnClickListener zugeweisen. Also Fisch.setOnClickListener(...); Du musst entsprechend schauen, welcher Fisch das ist (50, 100, etc.) und dann einen anderen OnClickListener zuweisen (der nur die 50/100/...-Score hochzählt).

Liebe Grüße impjor.

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

Tom-Oliver Dick

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

25.03.2014, 17:48:56 via Website

Dankeschön, werde ich gleich mal ausprobieren :)

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

25.03.2014, 18:24:02 via Website

Okay, ich hab das jetzt mal ausprobiert aber leider kommt in der Logcat dies hier:

03-25 18:21:50.550: E/AndroidRuntime(31616): java.lang.IllegalArgumentException: The key must be an application-specific resource id.

HAt jemand nocheinmal Rat für mich?

Antworten
Florian S.
  • Forum-Beiträge: 71

25.03.2014, 18:42:08 via Website

Kannst du deinen Quellcode posten wie du es jetzt gemacht hast?

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

25.03.2014, 18:50:24 via Website

Da wo der Fish gespawnt wird :
1fish25.setTag(FISH_TAG, 25);

In der OnClick Methode:
1int tag = (Integer) fish25.getTag(FISH_TAG);
2 if (tag == 25) {
3 caughtfish25 ++;
4 playplace.removeView(fish25);
5 }

Und der Logcat Auszug:
103-25 18:49:29.961: E/AndroidRuntime(31956): FATAL EXCEPTION: main
203-25 18:49:29.961: E/AndroidRuntime(31956): java.lang.IllegalArgumentException: The key must be an application-specific resource id.
303-25 18:49:29.961: E/AndroidRuntime(31956): at android.view.View.setTag(View.java:15463)

Ich hoffe das hilft :)

Antworten
Florian S.
  • Forum-Beiträge: 71

25.03.2014, 18:57:18 via Website

Versuche mal, den FISH_TAG als string in der strings.xml festzulegen und dann über R.string.FISH_TAG drauf zuzugreifen.

LG

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

25.03.2014, 19:45:34 via Website

Okay, hab ich erledigt, allerdigs kommt nun leider dies:
103-25 19:40:07.683: E/AndroidRuntime(6746): FATAL EXCEPTION: main
203-25 19:40:07.683: E/AndroidRuntime(6746): java.lang.NullPointerException
303-25 19:40:07.683: E/AndroidRuntime(6746): at com.togames.pointyfish.GameActivity.onClick(GameActivity.java:586)
403-25 19:40:07.683: E/AndroidRuntime(6746): at android.view.View.performClick(View.java:4247)
503-25 19:40:07.683: E/AndroidRuntime(6746): at android.view.View$PerformClick.run(View.java:17492)
603-25 19:40:07.683: E/AndroidRuntime(6746): at android.os.Handler.handleCallback(Handler.java:725)
703-25 19:40:07.683: E/AndroidRuntime(6746): at android.os.Handler.dispatchMessage(Handler.java:92)
803-25 19:40:07.683: E/AndroidRuntime(6746): at android.os.Looper.loop(Looper.java:153)
903-25 19:40:07.683: E/AndroidRuntime(6746): at android.app.ActivityThread.main(ActivityThread.java:5330)
1003-25 19:40:07.683: E/AndroidRuntime(6746): at java.lang.reflect.Method.invokeNative(Native Method)
1103-25 19:40:07.683: E/AndroidRuntime(6746): at java.lang.reflect.Method.invoke(Method.java:511)
1203-25 19:40:07.683: E/AndroidRuntime(6746): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
1303-25 19:40:07.683: E/AndroidRuntime(6746): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
1403-25 19:40:07.683: E/AndroidRuntime(6746): at dalvik.system.NativeStart.main(Native Method)

Soweit ich weiß steht dieses NullPointerException dafür, das in dieser Zeile eine Variabel 0. Okay Zeile 586:
1int tag = (Integer) fish.getTag(R.string.FISH_TAG);

wie kann den dieser Wert 0 sein?
Schließlich habe ich ihn vorher im script gerade erst beschrieben:
1fish.setTag(R.string.FISH_TAG, 25);

Warum?

Antworten
Florian S.
  • Forum-Beiträge: 71

25.03.2014, 20:32:41 via Website

Wie sieht denn deine Deklaration in der strings.xml-Datei aus? Hast du dort schon irgendwas zugewiesen?

— geändert am 25.03.2014, 20:33:04

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

26.03.2014, 07:32:52 via Website

Nein nicht wirklich:

1<string name="FISH_TAG"></string>

Antworten
Florian S.
  • Forum-Beiträge: 71

26.03.2014, 12:12:11 via App

Versuch mal von Anfang an irgendetwas was Sinn macht reinzuschreiben also zwischen die beiden Tags, dann kann der Fall eigentlich nicht auftreten dass der String null ist.

LG

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

26.03.2014, 13:24:18 via App

Hab ich auch schon ausprobiert, geht leider auch nicht :(

impjor hatte noch eine weitere Methode beschrieben, bei der ein anderer OnClickListener aufgerufen wird.
Wäre einer vllt. nochmal so nett und erläutert mir das ?

— geändert am 26.03.2014, 13:28:43

Antworten
Florian S.
  • Forum-Beiträge: 71

26.03.2014, 13:35:55 via Website

Alternative wäre sonst einfach in deiner OnClick-Methode in einem switch-Case die ID über R.id.xx zu überprüfen...

LG

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

26.03.2014, 15:10:17 via Website

Okay, sieht jetzt so aus :
1@Override
2 public void onClick(View v) {
3 int tag = (Integer) fish.getTag(R.string.FISH_TAG);
4
5 switch(tag) {
6 case 25:
7 caughtfish25++;
8 scoreopps();
9 playplace.removeView(fish25);
10 case 100:
11 caughtfish100++;
12 scoreopps();
13 playplace.removeView(fish100);
14 case 500:
15 caughtfish500++;
16 scoreopps();
17 playplace.removeView(fish500);
18 case 10:
19 time = time +10;
20 refreshscreen();
21 playplace.removeView(fishadd10);
22 case 11:
23 time = time -10;
24 refreshscreen();
25 playplace.removeView(fishdeducts10);
26 case 12:
27 time = 0;
28 refreshscreen();
29 playplace.removeView(fishsetzero);
30 default:
31 System.out.println("Fehler 311");
32
33 }


Leider bekommt ich immer noch :
103-26 15:08:09.469: E/AndroidRuntime(24805): FATAL EXCEPTION: main
203-26 15:08:09.469: E/AndroidRuntime(24805): java.lang.NullPointerException
303-26 15:08:09.469: E/AndroidRuntime(24805): at com.togames.pointyfish.GameActivity.onClick(GameActivity.java:586)
403-26 15:08:09.469: E/AndroidRuntime(24805): at android.view.View.performClick(View.java:4247)
503-26 15:08:09.469: E/AndroidRuntime(24805): at android.view.View$PerformClick.run(View.java:17492)
603-26 15:08:09.469: E/AndroidRuntime(24805): at android.os.Handler.handleCallback(Handler.java:725)
703-26 15:08:09.469: E/AndroidRuntime(24805): at android.os.Handler.dispatchMessage(Handler.java:92)
803-26 15:08:09.469: E/AndroidRuntime(24805): at android.os.Looper.loop(Looper.java:153)
903-26 15:08:09.469: E/AndroidRuntime(24805): at android.app.ActivityThread.main(ActivityThread.java:5330)
1003-26 15:08:09.469: E/AndroidRuntime(24805): at java.lang.reflect.Method.invokeNative(Native Method)
1103-26 15:08:09.469: E/AndroidRuntime(24805): at java.lang.reflect.Method.invoke(Method.java:511)
1203-26 15:08:09.469: E/AndroidRuntime(24805): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
1303-26 15:08:09.469: E/AndroidRuntime(24805): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
1403-26 15:08:09.469: E/AndroidRuntime(24805): at dalvik.system.NativeStart.main(Native Method)

Ich glaube das ich den Fehler beim setzten des Tags gemacht habe, vllt sieht ihr ja da was:
1fish.setTag(R.string.FISH_TAG, 25);
Dieser Code ist bei allen Fischen gleich außer natürlich der Wert.

Antworten
impjor
  • Forum-Beiträge: 1.793

26.03.2014, 16:35:07 via App

Du benutzt fish.getTag(...); das ist falsch. Als Parameter wird dir View v übergeben, also musst du v.getTag(...) benutzen.
Und im switch fehlen break s

— geändert am 26.03.2014, 16:35:49

Liebe Grüße impjor.

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

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

26.03.2014, 19:52:05 via App

Okay wenn ich v.getTag schreibe, kommt : v can not be resolved.
Was für eine Variabel muss ich da wo hin schreiben, sorry wenn das eine Dumbo Frage ist :)

Antworten
impjor
  • Forum-Beiträge: 1.793

26.03.2014, 21:39:27 via App

Das kann eigentlich nicht sein... Deine onClick sieht so aus:
@Override
public void onClick(View hier_ein_name) {
hier_der_name.getTag(...);
....
}

Liebe Grüße impjor.

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

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

26.03.2014, 22:04:33 via Website

Wäre Logisch, so hab ich das jetzt:
1@Override
2 public void onClick(View v) {
3 int tag = (Integer) v.getTag(R.string.FISH_TAG);
4
5 switch(tag) {
6 case 25:
7 caughtfish25++;
8 scoreopps();
9 playplace.removeView(fish25);
10 break ;
11 case 100:
12 caughtfish100++;
13 scoreopps();
14 playplace.removeView(fish100);
15 break ;
16 case 500:
17 caughtfish500++;
18 scoreopps();
19 playplace.removeView(fish500);
20 break ;
21 case 10:
22 time = time +10;
23 refreshscreen();
24 playplace.removeView(fishadd10);
25 break ;
26 case 11:
27 time = time -10;
28 refreshscreen();
29 playplace.removeView(fishdeducts10);
30 break ;
31 case 12:
32 time = 0;
33 refreshscreen();
34 playplace.removeView(fishsetzero);
35 break ;
36 default:
37 System.out.println("Fehler 311");
38 break ;
39
40 }

SetTag:
1v.setTag(R.string.FISH_TAG, 25);
das v kennt er nicht :(

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

28.03.2014, 08:52:16 via App

Weiß das keiner?

Antworten
SvenDD
  • Forum-Beiträge: 272

28.03.2014, 09:06:07 via Website

Du musst die Zeile auf View casten und nicht auf Integer.

int tag = (Integer) v.getTag(R.string.FISH_TAG);

Und je nach dem, was getTag zurück gibt, erstmal in dem Formnat abspeichern und dann auf int konvertieren.

Antworten
impjor
  • Forum-Beiträge: 1.793

28.03.2014, 14:30:26 via Website

Tom-Oliver Dick

1v.setTag(R.string.FISH_TAG, 25);
das v kennt er nicht :(

Dann heißt die Variable nicht v, sondern anders. Das müsstest du wissen, wie die View-Variable heißt, der du einen Tag zuweisen willst.

Liebe Grüße impjor.

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

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

28.03.2014, 14:53:37 via Website

Auf View casten ? Warum das den, ich möchte doch den tag mit einem Wert vergleichen ?!?
Mein Problem ist das er "v" nicht erkennt, was soll ich da tun.

Trotzdem Danke :)

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

28.03.2014, 15:00:58 via Website

Du hasst doch in der Funktion einen View Parameter übergeben, wie heißt denn der?
v einfach in diesen ändern.
Möchtest du den Tag auslesen oder schreiben?
Eigentlich ist es egal du musst halt zugriff auf die Aktuelle View haben.

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

Antworten
SvenDD
  • Forum-Beiträge: 272

28.03.2014, 15:46:27 via Website

Weil dein Parameter View v heißt.

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

28.03.2014, 18:08:47 via Website

Ahh danke hab gerade verstanden was ihr meint :) , so wird ein Schuh draus.
Kann ich ich der OnClick mehrer Argumente aufrufen like:
1public void onClick(View fish25, fish100, fish500) {
oder baucht jeder einen eigenen OnCLick ?

Antworten
impjor
  • Forum-Beiträge: 1.793

28.03.2014, 18:14:07 via App

Nein, dass ist so nicht möglich.
Du kannst aber einen OnClickListener erstellen und diesen mehreren Views zu weisen:
View.OnClickListener meinListener = new View.OnClickListener() {
//alles wie immer
public void onClick(...) {
...
}
};
meineView.setOnClickListener(meinListener);
meineZweiteView.setOnClickListener(meinListener);
usw.

Liebe Grüße impjor.

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

Antworten
Tom-Oliver Dick
  • Forum-Beiträge: 15

28.03.2014, 18:14:08 via Website

Vielen Dank :grin::bashful::grin::bashful::grin::bashful: es funktionier endlich:)
Ich werde nochmal hier ein Link posten, falls irgend jemand das Ergebnis sehen möchte :)

Antworten