2013-07-29 6 views
5

Ich habe ein DialogFragment, das einige Animationen einiger Layouts in seiner Ansicht hat. Wenn ich das Dialogfeld verwerfe, möchte ich eine Animation ausführen und wenn die Animation beendet ist, führen Sie die Abweisung aus.DialogFragment Animation des Layouts und "Versuch, das Fenster beim Zeichnen zu zerstören!" Fehler

Schritt 1: Rufen Sie das Fragment aus meiner Tätigkeit:

myDialog.show(getSupportFragmentManager(), ""); 

Schritt 2: Nachdem der Benutzer den Job mit dem Dialog beendet hatte, er drückt einen Knopf. Die Schaltfläche ruft eine Animation und danach möchte ich den Dialog verschwinden:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View layout = inflater.inflate(R.layout.my_layout, null); 

     layMain = (LinearLayout) layout.findViewById(R.id.layMain); 

     TextView btnCancel = (TextView) layout.findViewById(R.id.btnCancel); 
      btnCancel.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View arg0) { 
        final Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_to_bottom); 
        anim.setAnimationListener(new AnimationListener() { 

         @Override 
         public void onAnimationStart(Animation animation) { 

         } 

         @Override 
         public void onAnimationRepeat(Animation animation) { 

         } 

         @Override 
         public void onAnimationEnd(Animation animation) { 
          dismiss(); 
         } 
        }); 
        layMain.startAnimation(anim); 
       } 
      }); 
..... 

Wenn die Animationen endet, wird der Dialog geschlossen, aber ich erhalte diesen Fehler auf logcat

E/ViewRootImpl (25507) : Versuch, das Fenster beim Zeichnen zu zerstören! E/ViewRootImpl (25507): [email protected], title = com.mypackage/com.mypackage.MyActivity

Wie kann ich das verhindern?

Später bearbeiten: Wenn ich es ohne Animation verwende, funktioniert alles gut und es wird kein Fehler auf logcat angezeigt. Ich nehme an, dass es etwas mit der Animation zu tun hat.

Die Animation Ich verwende:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" > 

    <translate 
     android:duration="@android:integer/config_mediumAnimTime" 
     android:fromYDelta="0%p" 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:toYDelta="80%p" /> 

</set> 
+1

das bedeutet, dass Ihr Dialog nicht verschwunden ist ?? –

+1

Der Dialog verschwindet als normale Erwartung.So verhält sich alles normal, bis auf die Fehlermeldung, die nichts Gutes bedeuten kann. – Alin

+1

Das liegt daran, dass Sie das getSupportFragmentManager() als Kontextobjekt übergeben haben ... statt dessen haben Sie getActivity() ... übergeben. –

Antwort

8

Die einzige Lösung, die bisher funktioniert, ohne einen Fehler zu werfen, ist dies:

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }, 10); 

}

Ich bin offen für alle anderen sugestions

+1

Sie brauchen die 10 ms Verzögerung nicht. Sie können einfach die Methode 'post()' verwenden. –

2

Sie haben Pass Fragment Kontext als getSupportFragmentManager(). Also muss man es ändern:

myDialog.show(getFragmentManager(), ""); 
+1

'void android.support.v4.app.DialogFragment.show (FragmentManager-Manager, String-Tag)' erfordert Fragment-Manager nicht Aktivität. – Alin

+1

nach Änderung zu diesem werden Sie die richtige Lösung bekommen –

+1

Ich brauche Support Fragment Manager als meine apps muss kompatibel sein von Android 2.2 – Alin

2

Ich habe keine solche Probleme sehen:

public class MyDIalog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Button b = new Button(getActivity()); 
     final Dialog d = super.onCreateDialog(savedInstanceState); 
     d.setContentView(b); 

     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       b.animate().rotationYBy(180).setDuration(500).setListener(new Animator.AnimatorListener() { 
        @Override 
        public void onAnimationStart(Animator animator) { 
        } 

        @Override 
        public void onAnimationEnd(Animator animator) { 
         dismiss(); 
        } 

        @Override 
        public void onAnimationCancel(Animator animator) { 
        } 

        @Override 
        public void onAnimationRepeat(Animator animator) { 
        } 
       }); 
      } 
     }); 

     return d; 
    } 

} 

funktioniert mit:

new MyDIalog().show(getFragmentManager(),"dialog"); 

Alle Möglichkeiten, können Sie den dismiss() Anruf planen ein bisschen später mit:

@Override 
public void onAnimationEnd(Animator animator) { 
    getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     dismiss(); 
    } 
    }); 
} 
+2

Vielen Dank für Ihre Antwort. Leider funktioniert das nicht. Wie gesagt, wenn ich keine Animationen verwende, tritt der Fehler nicht auf. Der Unterschied zu Ihrem Code ist, dass ich onCreateView und getSupportFragmentManger verwende. Vielleicht gibt es einen Fehler in der Support-Bibliothek? – Alin

+1

@Alin Vielleicht habe ich auf Emulator mit ICS-Plattform getestet, es hat funktioniert. –

0

Sie mögen diese verwenden können.

@Override 
public void onAnimationEnd(Animation animation) { 
    Handler handler = new Handler(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      dismiss(); 
     } 
    }); 
} 

hier der Vorteil ist, müssen Sie Ihre eigene Zeit nicht definieren, auf diese Weise kann es helfen, alles andere einfach zu halten, wie ein Benutzer, den Sie selbst innerhalb kurzer Dauer überraschen kann, wenn Dialog ohne Entlassung gehalten nach Die Animation endet.

Verwandte Themen