Android片段动画无法按预期工作

时间:2015-03-03 13:52:25

标签: android android-layout android-fragments

女士们,先生们,

我正在学习为Android开发,我对片段动画有点困惑。

我的活动顶部有一个按钮。在按钮下,我以编程方式在创建活动时添加蓝色片段。点击按钮,我希望蓝色片段消失,并显示绿色片段。

没有动画就可以正常工作(留在方法顶部注释掉)。

然后我尝试使用replace()方法,然后删除+ add方法。两者都没有像我期望的那样......

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

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

有人可以帮我两个方法吗?我已经做了很多谷歌搜索,但无法解决问题所在。

另外,有几个词可以解释错误的地方,以便将来不再重复同样的错误。

以下是主要活动的代码:

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>

----编辑

我已经找到问题所在,它在另一个文件中,我现在添加到原始帖子

<?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值。它不应该在那里

1 个答案:

答案 0 :(得分:1)

我建议您始终使用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();
    }