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.