OnCLick für unterschiedliche Views????

  • Antworten:26
  • OffenNicht stickyNicht beantwortet
  • 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
  • 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
  • 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
  • Forum-Beiträge: 71

25.03.2014, 18:42:08 via Website

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

Antworten
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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

Empfohlene Artikel