RelativeLayout - einfügen/löschen von Views Problem

  • Antworten:7
Georg
  • Forum-Beiträge: 12

10.04.2014, 20:50:50 via Website

Hallo AndroidPit Forum,

Ich habe eine Klasse myQuads die einige Quadrate deffiniert. Wenn ich das Quadrat anklicke wird myQuad.hasPicture = 1 gesetzt und mit printKlickedQuads() wird an deren position ein Bild erstellt.

Ich habe zusätzlicheinen Bereich deffiniert und wenn ich ausserhalb dieses Bereichs auf ein Quadrat klicke wird myQuad.hasPicture = 1 auch gesetzt nur soll dann kein Bild an dessen Position erstellt werden.

Hier mal der Code:

1@SuppressLint("NewApi")
2 public void printKlickedQuads(Canvas canvas)
3 {
4// Löschen aller ImageViews im Layout
5 if(ViewHasChanged == 1)
6 {
7 for(int j = 0;j<quadHasElements;j++)
8 {
9 if(myQuads[j].hasPicture == 1)
10 {
11 Layout.removeView(Layout.findViewById(myQuads[j].QuadNr));
12 }
13 }
14 ViewHasPictures = 0;
15 ViewHasChanged = 0;
16 }
17
18
19 for(int p=0;p<quadHasElements;p++)
20 {
21 if(myQuads[p].hasPicture==1)
22 {
23 if(myQuads[p].P1X >= ZoomBereichx && myQuads[p].P3X <= (ZoomBereichx+400) && myQuads[p].P4Y <= (ZoomBereichy+240) && myQuads[p].P2Y >= ZoomBereichy)
24 {
25
26
27 if(Layout.findViewById(myQuads[p].QuadNr) == null)
28 {
29 ImageView b = new ImageView(mycontext);
30 b = RotateAndSetImageViewZoomLvl1(((myQuads[p].P1X*2)-(ZoomBereichx*2)),(((myQuads[p].P1Y)*2)-(ZoomBereichy*2)-20));
31 b.setId(myQuads[p].QuadNr);
32 Layout.addView(b);
33 ViewHasPictures++;
34
35 }
36 }
37 }
38
39 }
40
41 }
42
43
44
45
46 @SuppressLint("NewApi")
47 public ImageView RotateAndSetImageViewZoomLvl1(int x, int y)
48 {
49 ImageView Im = new ImageView(mycontext);
50 Im.setImageResource(R.drawable.test1bild);
51
52
53 LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(40,40);
54 Im.setLayoutParams(parms);
55
56 //Rotieren
57
58 Bitmap bMap;
59 bMap = BitmapFactory.decodeResource(getResources(), R.drawable.test1bild);
60 Matrix matrix = new Matrix();
61 matrix.postRotate(45);
62 Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
63 Im.setImageBitmap(bMapRotate);
64 Im.setX(x);
65 Im.setY(y);
66 return Im;
67 }

Mein Problem ist jetzt wenn ich ausserhalb des Bereichs ein myQuad.hasPicture == 1 habe geht er richtig über die
1if(myQuads[p].P1X >= ZoomBereichx && myQuads[p].P3X <= (ZoomBereichx+400) && myQuads[p].P4Y <= (ZoomBereichy+240) && myQuads[p].P2Y >= ZoomBereichy)
drüber und erstellt KEIN Bild, nur habe ich dan später wenn ich invalidate() aufrufe diesen Fehler:

104-10 19:52:47.405: E/AndroidRuntime(15668): FATAL EXCEPTION: main
204-10 19:52:47.405: E/AndroidRuntime(15668): java.lang.NullPointerException
304-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2916)
404-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12447)
504-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12555)
604-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2920)
704-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12447)
804-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12555)
904-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2920)
1004-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12447)
1104-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12555)
1204-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2920)
1304-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12447)
1404-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.View.getDisplayList(View.java:12555)
1504-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1144)
1604-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2270)
1704-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2142)
1804-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1953)
1904-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1110)
2004-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4484)
2104-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
2204-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.Choreographer.doCallbacks(Choreographer.java:555)
2304-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.Choreographer.doFrame(Choreographer.java:525)
2404-10 19:52:47.405: E/AndroidRuntime(15668): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
2504-10 19:52:47.405: E/AndroidRuntime(15668): at android.os.Handler.handleCallback(Handler.java:615)
2604-10 19:52:47.405: E/AndroidRuntime(15668): at android.os.Handler.dispatchMessage(Handler.java:92)
2704-10 19:52:47.405: E/AndroidRuntime(15668): at android.os.Looper.loop(Looper.java:137)
2804-10 19:52:47.405: E/AndroidRuntime(15668): at android.app.ActivityThread.main(ActivityThread.java:4856)
2904-10 19:52:47.405: E/AndroidRuntime(15668): at java.lang.reflect.Method.invokeNative(Native Method)
3004-10 19:52:47.405: E/AndroidRuntime(15668): at java.lang.reflect.Method.invoke(Method.java:511)
3104-10 19:52:47.405: E/AndroidRuntime(15668): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
3204-10 19:52:47.405: E/AndroidRuntime(15668): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
3304-10 19:52:47.405: E/AndroidRuntime(15668): at dalvik.system.NativeStart.main(Native Method)

Es muss am hinzu/entfernen der Views liegen! (Habs mit einem Punkt zeichnen stat einen ImageView getestest da funktioniert es)

Mache ich dabei etwas Falsch bzw. hat jemand eine Idee was mein Fehler sein könnte ?

Antworten
impjor
  • Forum-Beiträge: 1.793

10.04.2014, 23:00:09 via App

Etwas grundsätzliches: Variabeln/Funktionen bitte klein schreiben!
Sowas wie hasQuads schreit geradezu nach boolean, warum benutzt du 1 und 0 als Werte?

Zu dem fürchte ich, dass dein Problem schwer zu begreifen ist, kannst du genauer erläutern, was der Grundgedanke hinter dem gesamten ist?

Liebe Grüße impjor.

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

Antworten
Georg
  • Forum-Beiträge: 12

11.04.2014, 08:19:52 via Website

Also grundsätzlich geht es nur um das löschen und einfügen der Views:

hier das einfügen:
1ImageView b = new ImageView(mycontext);
2 b.setId(myQuads[p].QuadNr);
3 Layout.addView(b);

und hier das löschen:
1if(ViewHasChanged == 1)
2 {
3 for(int j = 0;j<quadHasElements;j++)
4 {
5 if(myQuads[j].hasPicture == 1)
6 {
7 Layout.removeView(Layout.findViewById(myQuads[j].QuadNr));
8 }
9 }
10 ViewHasChanged = 0;
11 }

Wenn ich jetzt: 4 Imagviews einfüge --> und wieder 4 lösche --> und wieder 4 einfüge --> usw. passt alles
aber wenn ich: 4 Imageviews einfüge --> 4 wieder lösche --> und nur 3 einfüge --> stürzt meine App mit den oben gennanten Fehler ab!

Antworten
Georg
  • Forum-Beiträge: 12

11.04.2014, 08:27:52 via Website

Durch befragen von Dr. Google finde ich immer wieder diesen Code als angebliche Lösung für dieses Problem. Nur verstehe ich ihn nicht :angry:

h ttp://stackoverflow.com/questions/15636658/nullpointerexception-when-adding-removing-views-of-a-relativelayout-animations


Solved, just informe the handler that im Removing the view with:
1handler.post(new Runnable() {
2 public void run() {
3 fogLayout.removeView(img);
4 }
5});

h ttp://stackoverflow.com/questions/6560472/exception-while-removing-a-view-from-a-linearlayout-in-android
I had the same problem. You have to use a Handler to execute the code that modifies the UI (removeView() in this case). I would add a Handler field and construct it in your onCreate() method. Then, in onAnimationEnd(), just do this:
1fHandler.post(new Runnable() {
2 @Override
3 public void run() {
4 list.removeView(w);
5 list.invalidate();
6 }
7}

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

11.04.2014, 13:16:46 via Website

Damit lagerst du das Entfernen des Elements in einen anderen Thread aus.
Sollte aber nicht funktionieren, da nur der Ui Thread auf views zugreifen darf.

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

Antworten
Georg
  • Forum-Beiträge: 12

14.04.2014, 18:43:36 via Website

Ist es möglich im Debug Modus zu sehen welche Views sich in meinem global deklarierten RelativeLayout befinden ?

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

14.04.2014, 20:21:18 via Website

Das solltest du normalerweise auf dem XML Dokument zusehen sein

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

Antworten