女士们,先生们,
我正在学习为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值。它不应该在那里
答案 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();
}