Làm thế nào để đảo ngược hoạt ảnh phân mảnh trên BackStack?


114

Tôi nghĩ rằng hệ thống sẽ đảo ngược các hoạt ảnh trên backstack khi nút quay lại được nhấn khi sử dụng các đoạn bằng mã sau:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);
ft.replace(R.id.viewContainer, new class(), "layout").addToBackStack(null).commit();

Câu trả lời:


265

Theo tài liệu android cho hoạt ảnh tùy chỉnh :

Thay đổi:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out);

Đến:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out );

và bây giờ các hoạt hình backstack - Ngược lại !!


2
btw, tôi biết điều này không liên quan đến câu hỏi và câu trả lời của bạn, nhưng bạn có thể liên kết tôi với thứ gì đó giải thích một chút về customAnimations không? : P
AreusAstarte

2
AreusAstarte: xem developer.android.com/reference/android/app/… , int, int, int)
mDroidd

Xin chào, tôi thực sự đang sử dụng Chuyển tiếp nội dung, đang hoạt động tốt, nhưng khi tôi nhấn trở lại và chuyển đến phân đoạn trước đó, nền chỉ phân tán hoạt ảnh của các chế độ xem nhưng cũng lấn át các chế độ xem phổ biến, có cách nào để tránh điều này không?
user3497504 14/09

23

Sử dụng hoạt ảnh đúng mà tôi đã sử dụng sau đây và nó hoạt động như một sự quyến rũ

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >
    <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>

slide_in_right.xml

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

    <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>

slide_out_left.xml

   <set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_mediumAnimTime" >

    <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>

slide_out_right.xml

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

    <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>

Sau đó, sử dụng sau trong khi thêm phân đoạn

setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left,
                                R.anim.slide_out_right, R.anim.slide_in_right)

và nó sẽ hoạt động 100%


2
Lưu ý điều này sẽ không hoạt động nếu bạn đang sử dụng người quản lý hỗ trợ mảnh hoặc nếu mảnh của bạn mở rộng các phiên bản hỗ trợ của Fragment
w3bshark

@ w3bshark Làm cách nào để có được những hình ảnh động như vậy hoạt động bằng cách sử dụng FragmentManagerFragmenttừ thư viện hỗ trợ?
Daniel Shatz

2
@DanielShatz Bạn phải sử dụng bản dịch thay vì objectAnimators. Ví dụ: slide_in_left.xml sẽ là: <translate android:fromXDelta="100%" android:startOffset="25" android:toXDelta="0" />Xem câu trả lời sau: stackoverflow.com/a/5151774/1738090
w3bshark

1
Tôi đang thử cái này (trên thiết bị Marshmallow - không thử các phiên bản khác). Nó không hoạt động. cuối cùng FragmentTransaction mảnhTransaction = getFragmentManager (). beginTransaction (); mảnhTransaction.setCustomAnimations (R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right); mảnhTransaction.replace (R.id.fl_right_container, detailFragment); mảnhTransaction.replace (R.id.fl_left_container, subcategoriesFragment, TestActivity.TAG_SUBCATEGORIES_FRAGMENT); mảnhTransaction.commit ();
techtinkerer

13

trong trường hợp của tôi

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, 
                       R.anim.slide_in_right, R.anim.slide_out_left);

sẽ tạo ra hoạt ảnh hoàn hảo.

slide_in_right

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-50%p"
               android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

1
Tôi đã nghĩ là tự mình làm, nhưng tôi quá lười biếng. Và tôi đã nói ai đó nên đăng bài này trên StackOverflow và nó đây! haha
F.Mysir

1
Trước đây chưa có ai đăng bài này và mình khá tin rằng đã đến lượt mình đăng câu trả lời này, để giúp những ai có thể ở cùng hoàn cảnh với mình ... lol @ F.Mysir
Hoàng Nguyễn Hữu

3
.setCustomAnimations(R.animator.fragment_fade_in,
        R.animator.fragment_fade_out,
        R.animator.fragment_fade_p_in,
        R.animator.fragment_fade_p_out)

Thay thế ở trên bằng:

mFragmentManager.beginTransaction()
    .setCustomAnimations(R.animator.fragment_fade_in,
            R.animator.fragment_fade_out,
            R.animator.fragment_fade_p_in,
            R.animator.fragment_fade_p_out)
    .replace(R.id.main_container, FragmentPlayerInfo.getInstance(data))
    .addToBackStack(FragmentPlayerInfo.TAG)
    .commit();

1
Tôi muốn khuyên bạn thêm giải thích về cách đề xuất của bạn giúp ích.
Wtower

2
Tôi không biết tại sao nó làm việc (:, nhưng khi thêm hình ảnh động sau replaceaddToBackstack, không làm việc
TarikW

2
@TarikW tôi hơi muộn, nhưng trật tự là rất quan trọng trong việc này, bạn cần phải setCostomAnimations gọi trước khi thay thế, phương pháp addToBackStack
MD Husnain Tahir

1

Điều này được đề cập trong lớp Giao dịch Phân mảnh.

/**
     * Set specific animation resources to run for the fragments that are
     * entering and exiting in this transaction. The <code>popEnter</code>
     * and <code>popExit</code> animations will be played for enter/exit
     * operations specifically when popping the back stack.
     *
     * @param enter An animation or animator resource ID used for the enter animation on the
     *              view of the fragment being added or attached.
     * @param exit An animation or animator resource ID used for the exit animation on the
     *             view of the fragment being removed or detached.
     * @param popEnter An animation or animator resource ID used for the enter animation on the
     *                 view of the fragment being readded or reattached caused by
     *                 {@link FragmentManager#popBackStack()} or similar methods.
     * @param popExit An animation or animator resource ID used for the enter animation on the
     *                view of the fragment being removed or detached caused by
     *                {@link FragmentManager#popBackStack()} or similar methods.
     */
    @NonNull
    public abstract FragmentTransaction setCustomAnimations(@AnimatorRes @AnimRes int enter,
            @AnimatorRes @AnimRes int exit, @AnimatorRes @AnimRes int popEnter,
            @AnimatorRes @AnimRes int popExit);

vì vậy cuối cùng bạn có thể sử dụng phương pháp như thế này

 mFragmentManager.beginTransaction()
                        .replace(R.id.container, fragment)
                        .setCustomAnimations(R.anim.slide_left,//enter
                                             R.anim.slide_out_left,//exit
                                             R.anim.slide_right,//popEnter
                                             R.anim.slide_out_right)//popExit
                        .addToBackStack(fragment.toString())
                        .commit();

0

công việc này cho tôi !! mã này cho phân mảnh! nếu bạn muốn sử dụng mã này trong hoạt động, hãy xóa ngay từ đầu getActivity()!!

getActivity().getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.fade_out,android.R.anim.slide_in_left, android.R.anim.fade_out)
        .replace(R.id.fragment_container, new YourFragment)
        .addToBackStack(null)
        .commit();

Chúc bạn may mắn!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.