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();
}
女士们,先生们,
我正在学习为 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();
}