Benutzerdefinierte Animation für Android FragmentTransaction (Unbekannter Animatorname: Übersetzen)

68

Ich versuche, eine benutzerdefinierte Animation für mein Fragment zu erstellen.

Ich habe die Online-Tutorials befolgt, aber den folgenden Fehler erhalten:

java.lang.RuntimeException: Unbekannter Animatorname: translate

Das XML für die Animation ist unten:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="300" />
</set>

Die Java-Datei wird unten angezeigt:

public void goCategory(View v) {        
    FragmentTransaction ft = fm.beginTransaction();     
    ft.setCustomAnimations(R.animator.anim_in_left, R.animator.anim_out_left);              
    ft.show(fragment);
    ft.commit();
}

Ich habe Probleme, die Lösungen in den anderen Threads zu verstehen. Wenn jemand es für mich dumm machen könnte, würde ich es wirklich schätzen.

SalicBlu3
quelle
Wenn Sie die Animation mit der Support-Bibliotheksversion von Fragment verwenden, ist dies möglicherweise Ihr Problem.
Typ-a1pha

Antworten:

112

Es wird nicht funktionieren, Sie sollten den Objektanimator verwenden

animator / slide_in_left.xml

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

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType" />

</set>

animator / slide_out_right.xml

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

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-1000"
        android:valueType="floatType" />

</set>

Klassenunterkategorie

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            // return super.onCreateView(inflater, container, savedInstanceState);

            View view = (ViewGroup) inflater.inflate(R.layout.product_frame, null);
            getFragmentManager().beginTransaction()
                    .replace(R.id.sub_header, new Sub_Header()).commit();
            getFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.animator.slide_in_left,
                            R.animator.slide_out_right, 0, 0)
                    .replace(R.id.product_frame, new Sub_Catagory_Grid()).commit();

            view.getWidth();
            return view;

        }
Ammar ali
quelle
Was ist das Problem? Poste es hier. Ich verstehe deine Frage nicht. Was meinst du damit, dass es nicht funktioniert?
Ammar Ali
2
Er bezieht sich auf Ihre Aussage, dass die Lösung des OP nicht funktioniert, und bittet um Klarstellung.
Tom
5
Für die Person, die nicht weiß, warum "Animation übersetzen" für neue APIs nicht funktioniert: Durch Lesen des Quellcodes (Api 19) werden nur "objectAnimator" und "animator" unterstützt.
Lei Guo
4
Diese Animationen bieten keine guten Effekte, da sie fest codierte Übersetzungswerte verwenden. Ich habe zum Beispiel festgestellt, dass ein Fragment mit dem anderen überlappt. Ich gehe davon aus, dass unterschiedliche Bildschirmgrößen zu unterschiedlichem Verhalten führen würden. Leider ist es nicht möglich, eine relative Übersetzung mit objectAnimators anzugeben.
Sandra
sollte der "from" -Wert von slide_out_right nicht 1000 und der Wert von slide_in_left -1000 sein?
Muilpp
116

Wahrscheinlich mischen Sie zwei Apis. Es gibt zwei Fälle:

  • Wenn Sie unter 3.0 zielen oder Support-v4-Fragmente verwenden: Sie müssen die alte Animations-API verwenden, dh die, die Sie verwenden (sie gehen in anim / und sind R.anim.thing)

  • Wenn Sie auf über 3.0 abzielen und native Fragmente verwenden: Sie müssen die neuen Animations-APIs verwenden, dh ObjectAnimators (sie gehen in animator / und sind R.animator.thing).

Minivac
quelle
1
Würdest du zufällig wissen, wo in der Dokumentation steht, dass du Objektanimatoren für native Fragmente verwenden musst?
kmdupr33
1
Ich habe den Quellcode der beiden APIs überprüft und festgestellt, dass die gesamte Animations-XML in den Ordner res / anim verschoben werden sollte. Ich habe keine Analyse des Animators /
Lei Guo
0

Als @minivac antwortete, mischen Sie zwei APIs. Weitere Informationen zum Hinzufügen benutzerdefinierter Animationen zu Fragmenttransaktionen finden Sie im Beispiel zum Anzeigen von Karten-Flip-Animationen in den Android-Schulungshandbüchern. Es löst genau Ihr Problem.

txedo
quelle