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


83

지원 패키지 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>

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


1
조각은 Honeycomb (API 11, Android 3.0)까지 도입되지 않았습니다. 그게 문제가 될 수 있지만 Eclipse가 당신에게 말할 것이라고 생각했을 것입니다.
— Steve Blackwell

6
이것이 제가 지원 패키지를 사용하는 이유입니다.
— adheus

답변:


256

관리자는 애니메이션을 설정하기 전에 내 트랜잭션을 쌓았 기 때문에 애니메이션없이 트랜잭션을 쌓습니다 (슬프지만 사실) 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();

당신은 자기 반환 된 개체 트릭 피 문 분할 그래서
— sherpya

4
transaction.something().somethingelse().replace().commit(), 많은 android 메소드가 반환 this되므로 변수를 다시 입력하는 것을 피할 수 있지만 여기에서는 부작용이 발생 setCustomAnimations()하므로 별도로 호출해야합니다
— sherpya

44
그냥 참고로, "자기 반환 된 개체의 트릭은" "방법 체인"이라고합니다
— 에고

위의 호출을 연결하는 메서드는 확실히 작동합니다. 내 프로젝트에서 테스트했습니다.
— MawrCoffeePls

추가로 백 스택에서 팝될 때 조각을 애니메이션하려면 transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);대신 사용하십시오.
— Justin

23

위에서 제안한 것처럼 별도의 진술이 확실히 작동합니다. 그러나 여기서 트릭 은 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이 도움이 될 수 있도록 여기에 두십시오. 건배!


1
메서드 체이닝에 '점'연산자를 사용하는 방식에 약간 불쾌합니다.
— Shaishav

1
@Shaishav에 동의하고 2 년 전에이 답변을 작성하여 업데이트했습니다. 감사합니다!
— Harisewak

7

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

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


애니메이션은 현재 작동하지만 새로운 문제-애니메이션 동작이 변경되었습니다. 수평으로 미끄러지기 전에 (예상대로). 이제 코너에서 확장
— Sharad Kale

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.