बैकस्टैक पर फ्रैगमेंट एनिमेशन कैसे रिवर्स करें?


114

मैंने सोचा था कि सिस्टम बैकस्टैक पर एनिमेशन को उल्टा कर देगा जब निम्नलिखित कोड का उपयोग करके टुकड़े का उपयोग करते समय पीछे का बटन दबाया जाता है:

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();

जवाबों:


266

कस्टम एनीमेशन के लिए Android प्रलेखन के अनुसार :

परिवर्तन:

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

सेवा:

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

और अब बैकस्टैक एनिमेशन - रिवर्स में !!


2
btw, मुझे पता है कि यह आपके प्रश्न और उत्तर से जुड़ा नहीं है, लेकिन क्या आप शायद मुझे किसी ऐसी चीज़ से जोड़ सकते हैं, जो कस्टमएनिमेशन को थोड़ा-बहुत समझाती है? : पी
अरेसस्टार्ट

2
AreusAstarte: डेवलपर देखें .android.com/reference/android/app/… , int, int, int)
mDroidd

हाय im वास्तव में सामग्री संक्रमण का उपयोग करते हुए, ठीक काम कर रहा है, लेकिन जब मैं वापस दबाता हूं और पिछले टुकड़े पर जाता हूं तो पृष्ठभूमि केवल विचारों को चेतन करती है, लेकिन पूर्ववर्ती लोगों के साथ भरोसा करते हुए, इससे बचने का कोई तरीका?
user3497504

23

सही एनीमेशन का उपयोग करें मैंने निम्नलिखित और इसके आकर्षण की तरह काम किया है

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>

तब टुकड़ा जोड़ते समय निम्नलिखित का उपयोग करें

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

और यह 100% काम करेगा


2
ध्यान दें कि यह तब काम नहीं करेगा जब आप समर्थन खंड प्रबंधक का उपयोग कर रहे हैं या यदि आपका टुकड़ा टुकड़े के समर्थन संस्करण का विस्तार करता है
w3bshark

@ w3bshark समर्थन पुस्तकालय का उपयोग करके FragmentManagerऔर इस तरह के एनिमेशन कैसे प्राप्त करें Fragment?
डैनियल शटज

2
@DanielShatz आपको ऑब्जेक्ट के बजाय अनुवाद का उपयोग करना होगा। उदाहरण के लिए, Slide_in_left.xml होगा: <translate android:fromXDelta="100%" android:startOffset="25" android:toXDelta="0" />इस उत्तर को देखें: stackoverflow.com/a/5151774/1738090
w3bshark

1
मैं इसे बाहर की कोशिश कर रहा हूँ (मार्शमैलो डिवाइस पर - अन्य संस्करणों की कोशिश नहीं की)। यह काम नहीं करता है। अंतिम फ्रैगमेंटट्रांसशन फ्रैगमेंटट्रैक्शन = getFragmentManager ()। startTransaction (); fragmentTransaction.setCustomAnimations (R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_right_right); fragmentTransaction.replace (R.id.fl_right_container, detailFragment); fragmentTransaction.replace (R.id.fl_left_container, subcategoriesFragment, TestActivity.TAG_SUBCATEGORIES_FRAGMENT); fragmentTransaction.commit ();
Techtinkerer

13

मेरे मामले में

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

सही एनीमेशन पैदा करेगा।

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
मैंने इसे स्वयं करने का सोचा, लेकिन मैं बहुत आलसी हूं। और मैंने कहा कि किसी को यह StackOverflow पर पोस्ट करना चाहिए और यहाँ यह है! हाहा
एफ.मिसिर

1
इससे पहले किसी ने भी इसे पोस्ट नहीं किया था और मुझे विश्वास था कि इस जवाब को पोस्ट करने के लिए समय मेरी बारी थी, इसलिए मेरी मदद करने के लिए जो मेरे जैसे ही जूते में हो सकता है ... lol @ F.Mysir
Hoang Nguyen Huu

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

इसके साथ उपरोक्त बदलें:

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
मैं आपको यह सुझाव देने की सलाह दूंगा कि आपकी सिफारिश कैसे मदद करती है।
Wtower

2
मुझे नहीं पता कि यह क्यों काम करता है: (, लेकिन जब एनीमेशन को जोड़ा गया replaceऔर addToBackstack, काम नहीं किया गया
TarikW

2
@TarikW मैं थोड़ा देर से हूँ, लेकिन यह आदेश महत्वपूर्ण है, इसमें आपको setCostomAnimations को कॉल करने की आवश्यकता है, इससे पहले कि addToBackStack विधियों
MD

1

यह फ्रैगमेंट ट्रांजैक्शन क्लास में उल्लिखित है।

/**
     * 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);

तो अंत में आप इस तरह से विधि का उपयोग कर सकते हैं

 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

मेरे लिए यह काम !! टुकड़े के लिए यह कोड! यदि आप गतिविधि में इस कोड का उपयोग करना चाहते हैं, तो शुरुआत में हटाएं 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();

आप सौभाग्यशाली हों!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.