Android 片段动画未按预期工作

Android fragment animations not working as expected

女士们,先生们,

我正在学习为 android 进行开发,但我对片段动画有点困惑。

我有一个 activity,顶部有一个按钮。在创建 activity 时,我以编程方式在按钮下添加一个蓝色片段。单击按钮时,我希望蓝色片段消失,并出现绿色片段。

它在没有动画的情况下工作正常(在方法顶部将其注释掉)。

然后我尝试使用 replace() 方法,然后再使用 remove + add 方法。两者都不像我期望的那样...

替换:我点击按钮,蓝色片段滑出。绿色碎片已经存在于蓝色碎片下方。然后绿色消失并按预期滑入。

移除/添加:蓝色片段消失没有动画,绿色片段已经存在,然后消失并滑入

有人可以帮我解决这两个问题吗?我做了很多谷歌搜索,但无法弄清楚问题是什么。

还有,说两句错的地方,免得我以后再犯同样的错误。

这里是主要代码 activity:

package com.example.zz0011_detach_attach_fragment;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity
{
    FragmentManager fm = getFragmentManager();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );

        FragmentTransaction ft = getFragmentManager().beginTransaction();       

        ft.add(R.id.blueFragmentPlaceholder, new BlueFragment(), "blueFragmentTag" );

        ft.commit();
    }

    public void buttonClicked ( View view )
    {
        // ==============================================================================
        // ================================================================= NO ANIMATION

        // ------------------------------------------------------------------- WORKS FINE

        // ==============================================================================       

        // FragmentTransaction ft = getFragmentManager().beginTransaction();    

        // ft.remove(fm.findFragmentByTag("blueFragmentTag"));
        // ft.add(R.id.greenFragmentPlaceholder, new GreenFragment(), "greenFragmentTag" ); 

        // ft.commit();

        // ==============================================================================
        // ================================================================== REPLACEMENT

        // ----------------------------------------------------- BLUE FRAGMENT SLIDES OUT 
        // ----- GREEN FRAGMENT IS ALREADY PRESENT UNDERNEATH, DISAPPEARS, SLIDES BACK IN 

        // ==============================================================================       
        //       getFragmentManager().beginTransaction().setCustomAnimations 
        //       (
        //              R.animator.slide_in, R.animator.slide_out, R.animator.slide_out, R.animator.slide_in 
        //          ).replace 
        //          ( 
        //              getFragmentManager().findFragmentByTag ( "blueFragmentTag" ).getId(), new GreenFragment() 
        //          ).commit();     


        // ==============================================================================
        // ========================================================= REMOVAL AND ADDITION

        // --------------------------------- BLUE FRAGMENT DISAPPEARS  WITHOUT  ANIMATION
        // ----- GREEN FRAGMENT IS ALREADY PRESENT UNDERNEATH, DISAPPEARS, SLIDES BACK IN 

        // ==============================================================================       

        getFragmentManager().beginTransaction().setCustomAnimations ( R.animator.slide_out, 0 ).
        remove ( getFragmentManager().findFragmentByTag ( "blueFragmentTag" ) ).commit();       

        getFragmentManager().beginTransaction().setCustomAnimations ( R.animator.slide_in, 0 ).
        add(R.id.greenFragmentPlaceholder, new GreenFragment(), "greenFragmentTag" ).commit();
    }
}

这是 android_main XML 文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.zz0011_detach_attach_fragment.MainActivity" >

<Button
    android:id="@+id/clicableButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="buttonClicked"
    android:text="@string/click_me"
    android:textAlignment="center" />

<FrameLayout
    android:id="@+id/blueFragmentPlaceholder"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_below="@id/clicableButton" 
    android:layout_marginTop="20dp"
    >
</FrameLayout>

---- 编辑

我找到了问题出在哪里,它在我现在添加到原始文件中的另一个文件中 post

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

    <objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:propertyName="x"
    android:valueFrom="-1000"
    android:valueTo="0"
    android:valueType="floatType"
    android:startOffset="300" />

</set>

显示绿色片段的原因是 startOffset 值。它不应该在那里

我建议您始终使用 replace 并跳过开头的 add。此外,您指的是不同的标签,使用相同的标签在同一堆栈中维护 Fragments 。使用下面的方法替换片段,其中 R.id.content 是内容 (FrameLayout) 将显示 Fragments 的内容,所有这些都使用相同的方法。我为您添加了 clearBackStack,因此您可以选择何时显示 Fragment 作为根级别。

private void switchFragment(Fragment fragment, boolean clearBackStack){
        if (clearBackStack) {
            getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        } 
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.content, fragment, "current");
        if (!clearBackStack) {
            ft.addToBackStack(null);
        }
        ft.commitAllowingStateLoss();
    }