it-swarm.com.de

NullPointerException, die auf keine Zeile in meinem Code verweist

Ich arbeite an einem Spiel, bei dem der Spieler Gegenstände auf den Bildschirm ziehen und ablegen kann. Ich habe eine private Methode, mit der ich ein Drag/Drop-Ereignis für alle Elemente simulieren kann, die der Spieler bewegen kann. Für das Ziehen verlasse ich eigentlich die Ansicht, die sie berührt haben, und erstelle eine neue ImageView mit und setze die Zeichenfläche auf den drawingCache aus der berührten Ansicht. Dann verschiebe ich diese neu erstellte ImageView auf dem Bildschirm und folgt ihrem Finger. Wenn Sie Ihren Finger loslassen (die Ansicht fallen lassen), rufe ich myLayout.remove(movingImg); auf, um ihn vom Bildschirm zu entfernen. Wenn ich ein simuliertes Ziehereignis starte und dann manuell eines der anderen Elemente aufnehme, bekomme ich einen Nullzeiger auf den Aufruf myLayout.remove (). Hier ist die Ablaufverfolgung von Log:

04-06 10:37:43.610: ERROR/AndroidRuntime(23203): Java.lang.NullPointerException
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:2122)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.drawChild(ViewGroup.Java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.drawChild(ViewGroup.Java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.drawChild(ViewGroup.Java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.drawChild(ViewGroup.Java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewGroup.dispatchDraw(ViewGroup.Java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.View.draw(View.Java:9032)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.widget.FrameLayout.draw(FrameLayout.Java:419)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at com.Android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.Java:1910)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewRoot.draw(ViewRoot.Java:1608)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewRoot.performTraversals(ViewRoot.Java:1329)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.view.ViewRoot.handleMessage(ViewRoot.Java:1944)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.os.Looper.loop(Looper.Java:126)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Android.app.ActivityThread.main(ActivityThread.Java:3997)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Java.lang.reflect.Method.invokeNative(Native Method)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at Java.lang.reflect.Method.invoke(Method.Java:491)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203):     at dalvik.system.NativeStart.main(Native Method)

Die Spur zeigt nicht auf irgendwo in meiner Aktivität. Die Ausnahme wird immer dann ausgelöst, wenn myLayout.remove () in der simulierten Ziehansicht aufgerufen wird. Ich habe diese Zeile mit einem Try/Catch umgeben, aber das hat nichts getan. Ich weiß, dass dies die Zeile ist, die mir Probleme bereitet. Wenn ich sie auskommentiere, bekomme ich keine Ausnahme, aber offensichtlich wird meine Ansicht nie vom Bildschirm entfernt. Ich baue diese App auf einem Motorola Xoom. Ich bin mir nicht sicher, ob dies ein gerätespezifisches Problem ist oder nicht. Weiß jemand, was hier los sein könnte?

Hier wird das .removeView () aufgerufen von:

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            Log.i(myTag, "Animation End");

            try {
                //myLayout.removeView(simulateMovingImg); //This is the line that is throwing a null pointer
                simulateMovingImg.setVisibility(View.GONE); //This is how I am currently getting around the issue
                params = new LayoutParams(oneImg.getWidth(),oneImg.getHeight()); // While its moving it appears larger than normal
                 simulateMovingImg.setLayoutParams(params);                     //  so I set it back to the normal size
                 if(whichTarget == true){
                     targetImg.setImageDrawable(simulateMovingImg.getDrawable()); //targetImg is one of the 'drop zones' so I set its 
                                                                                //  drawable to make it seem like the view was 'dropped' into this zone
                 }else{
                     target1Img.setImageDrawable(simulateMovingImg.getDrawable()); // same with target1Img. 
                 }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

             iAmDone = true;
        }
    });

Das ist in einem AnimationListener für die Übersetzungsanimation, die mein ImageView von dort aus bewegt, wo es abgelegt wird.

45
FoamyGuy

Android macht eine Ausnahme, wenn Sie die Ansichtshierarchie in animationEnd ändern.

Alles, was Sie tun müssen, ist, Ihren Anruf wie folgt zu verschieben:

@Override
public void onAnimationEnd(Animation animation) {
    new Handler().post(new Runnable() {
        public void run() {
            myLayout.removeView(simulateMovingImg);
        }
    });
}
98
jptsetung

Können Sie dies versuchen, um sicherzustellen, dass simulateMovingImg vorhanden ist

    if (myLayout.indexOfChild() >= 0)
    {
        myLayout.removeView(simulateMovingImg);
    }
0
rajath

Ich habe eine akzeptierte Antwort leicht geändert (sie funktioniert auch), um Handler zu vermeiden.

@Override
public void onAnimationEnd(Animation animation) {
    imageView.post(new Runnable() {
        @Override
        public void run() {
            layout.removeView(imageView);
        }
    });
}
0
CoolMind

Meine Vermutung ist, dass es ein Multi-Threading-Problem ist. Es sieht so aus, als ob die interne Android-Wiedergabeschleife auf einen Nullzeiger trifft, weil Sie das Bild aus einem anderen Thread entfernt haben. Das Android-UI-Framework ist ein einzelner Thread und alle Änderungen an der UI müssen im UI-Thread erfolgen. Wenn dies das Problem ist, auf das Sie stoßen, können Sie Ihren Aufruf einfach an den UI-Thread delegieren. 

Hier gibt es einige verwandte Informationen: Android-Threading

0
Justin Waugh

Ich traf dieses Problem, nachdem ich appcompat-v7 aktualisiert hatte. Die letzte stabile Version der oben genannten Abhängigkeit ist jetzt:

  compile 'com.Android.support:appcompat-v7:23.2.1'
0
huu duy