it-swarm.com.de

Übergang Android-Fragment nach oben

Ich habe ein Fragment, das ein anderes Fragment ersetzen soll. Ich möchte die Animation angeben. Die Animation wird jedoch ignoriert.

transaction.replace(R.id.my_fragment, newFrag);
transaction.addToBackStack(null);
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);

slide_in_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="0%p"
    Android:toYDelta="100%p" />

slide_out_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="100%p"
    Android:toYDelta="0%p" />

Alles, was ich wirklich erreichen möchte, ist, dass das neue Fragment von unten hineingleitet. Meine Animationen werden ignoriert. Was fehlt der Code?

22
user3093402
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
transaction.addToBackStack(null);
transaction.replace(R.id.my_fragment, newFrag);

slide_in_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="100%p"
    Android:toYDelta="0%p" />

slide_out_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="@Android:integer/config_longAnimTime"
    Android:fromYDelta="0%p"
    Android:toYDelta="-100%p" />
25
Tyler Davis

Es ist einige Zeit vergangen, seit diese Frage gestellt wurde, aber hier ist eine Antwort für andere Leute, die hierher kommen:

e1da hat recht, sofern der Aufruf von setCustomAnimation() vor replace() aufgerufen werden muss. Andernfalls wird die Animation nicht angezeigt.
Das zweite Problem ist, dass Sie wahrscheinlich native Fragmente verwenden, die nicht mit den Ansichtsanimationen animiert werden können.

Verwenden Sie die folgenden Dateien:

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true" >
    <objectAnimator
        Android:duration="500"
        Android:propertyName="y"
        Android:valueFrom="1280"
        Android:valueTo="0"
        Android:valueType="floatType" />
</set>

slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true" >
    <objectAnimator
        Android:duration="500"
        Android:propertyName="y"
        Android:valueFrom="0"
        Android:valueTo="-1280"
        Android:valueType="floatType" />
</set>

Eine kleine Erklärung:
Sie müssen zwischen der Ansichtsanimation für Unterstützungsfragmente einerseits und der Eigenschaftsanimation für native Fragmente andererseits unterscheiden. 

Animation anzeigen:
Ist die vor-Android 3.0-Methode zum Animieren von Ansichten. Beispielcode hierfür ist der slide_in.xml und slide_up.xml von user3093402

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromYDelta="0%p"
Android:toYDelta="100%p" />

Es ist erwähnenswert, dass Sie keine Fragmente mit der Ansichtsanimation animieren können. Eine Ausnahme bilden Fragmente aus der Support-Bibliothek (Android.support.v4.app.Fragment).

Eigenschaftsanimation
Auf diese Weise können Objekte nach Android 3.0 animiert werden. Es wird auch als .xml-Datei deklariert, verwendet jedoch das Tag "valueAnimator" (objectAnimator erweitert valueAnimator). Beispiele sind in der Antwort auf die Frage zu finden: So können native Fragmente (Android.app.Fragment) animiert werden.

Siehe auch:

Hoffe das hilft,
Kai

EDIT: Wie von Raphael Royer-Rivard ausgeführt, ist die feste Bildschirmgröße eine schlechte Praxis. Es ist besser, eine Konstante aus dem Betriebssystem zu verwenden, wie in getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi (Siehe DisplayMetrics ). Aber ich habe seit einiger Zeit keine Android-Entwicklung mehr gemacht, also weiß ich nicht, welche.

16
Kaschwenk

code für slide_in_up:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:duration="@Android:integer/config_mediumAnimTime"
            Android:fromYDelta="100%p"
            Android:toYDelta="0%p" />
    </set>

code für slide_in_down:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
           Android:duration="@Android:integer/config_mediumAnimTime"
           Android:fromYDelta="0%p"
           Android:toYDelta="100%p" />
    </set>

code für slide_out_up:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
       <translate
          Android:duration="@Android:integer/config_mediumAnimTime"
          Android:fromXDelta="0"
          Android:toYDelta="100%" />
    </set>

code für slide_out_down:

<?xml version="1.0" encoding="utf-8"?>
   <set xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <translate
          Android:duration="@Android:integer/config_mediumAnimTime"
          Android:fromXDelta="0"
          Android:toYDelta="-100%" />
   </set>

und danach in Ihrer Aktivität oder Fragment-Animation wie folgt:

    Fragment fragment = new Fragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_in_down, R.anim.slide_out_down, R.anim.slide_out_up);
    transaction.replace(container, fragment).commit();
10
Moaz H

Derzeit ist dies bei Android.transition so einfach wie fragment.enterTransition = Slide() oder fragment.enterTransition = Fade()

Hinweis: Min Version L.

0
Ixx

R.anim wird dort nicht arbeiten, aber R.animator wird es zum Beispiel tun

transaction.setCustomAnimations(Android.R.animator.fade_in, Android.R.animator.fade_out);
0
Rahul Singh