[android] Android-조각 트랜잭션이 실행되지 않는 사용자 지정 애니메이션

지원 패키지 v4와 함께 Google API 8 (Android 2.2)을 사용하고 있습니다.

오류나 애니메이션을 제공하지 않습니다.

트랜잭션:

FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();

애니메이션 :

slide_in_left.xml

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

slide_out_right.xml

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

여기서 무슨 일이 일어나고 있는지 아는 사람이 있습니까?



답변

관리자는 애니메이션을 설정하기 전에 내 트랜잭션을 쌓았 기 때문에 애니메이션없이 트랜잭션을 쌓습니다 (슬프지만 사실) setCustomAnimations().

해결책은 먼저 애니메이션을 설정하는 것입니다.

FragmentTransaction transaction = manager.beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();


답변

위에서 제안한 것처럼 별도의 진술이 확실히 작동합니다. 그러나 여기서 트릭setCustomAnimation트랜잭션 유형 즉, 설정 하기 전에하는 것입니다. add, replace등. 그렇지 않으면 그렇지 않습니다. 따라서 동일한 논리를 적용하는 method chaining것도 작동합니다. 예.

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.a_slide_up,
                             R.anim.a_slide_down,
                             R.anim.a_slide_up,
                             R.anim.a_slide_down)
        .add(R.id.root_layout,
             MyFrag.newInstance())
        .addToBackStack("MyFrag")
        .commit();

선호하는 사람 method chaining이 도움이 될 수 있도록 여기에 두십시오. 건배!


답변

가장 인기있는 질문이므로 여기에 남겨 두세요. 단편 트랜잭션이 애니메이션되지 않는 것과 동일한 문제가 발생했습니다. 범인은 포함하는 레이아웃에서 속성을로 android:animateLayoutChanges설정했습니다 true.

다른 파일에 중첩 된 레이아웃이있을 때 눈에 띄기 어려울 수 있으므로 누군가가 솔루션을 찾는 데 시간을 절약하는 데 도움이되기를 바랍니다.


답변

또 다른 이유는 fragmentTransaction.show()커밋 전에 불필요하게 배치 할 수 있습니다 . 이로 인해 일부 Android API 버전에서는 팝 전환이 표시되지 않습니다.


답변