如何在Android中使用默认动画?

10

我想要使用Activity默认的动画来处理Fragment。我在这里找到了一些相关的内容:

Android: 使用Activity默认的动画处理Fragments

问题是:好的,比如我需要 "activityOpenEnterAnimation",那么我该如何使用它呢?

使用以下代码是无法实现的:

        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.setCustomAnimations(android.R.anim.activityOpenEnterAnimation, android.R.anim.activityOpenExitAnimation);

        transaction.replace(R.id.container, fragment)
                .addToBackStack(((Object) fragment).getClass().getName())
                .commit();

提示?谢谢!:)

3个回答

10
现今,Android文档明确建议不直接使用android.R.*中的资源,因为每个平台版本都会对它们进行更改。甚至有些资源在一个版本中消失,在另一个版本中重新出现,所以你不能依赖它们。另一方面,许多资源是私有的,无法从开发人员的代码中获取。
最安全(也是推荐的)方法是,从你想要的Android版本的源代码中复制并粘贴你需要的资源(在这种情况下是动画),然后通过常规的R.*在你自己的代码中使用它们。
你可以按照[1]中所述的方式,以多种方式浏览Android源代码。
[1]我在哪里可以在线查找Android源代码?

我已经尝试过:transaction.setCustomAnimations(R.anim.activity_open_enter, R.anim.activity_open_exit);但是它和在activity中不一样... 有什么建议吗? - Filnik
1
在Android平台的源代码中搜索R.anim.activity_open_enter,并检查它是如何真正使用的,也许唯一的区别是一个简单的配置,或者使用另一个构造函数等。 - thelawnmowerman
“现在,Android文档明确建议不直接使用资源”,这是您在2014年写的。请问您的来源在哪里?我从未听说过他们这么说,事实上,他们大多数时候都会说:一定要使用平台值,这就是我们为什么提供它们的原因! - Martin Marconcini
4年前它曾经这么说(如果你真的看到了日期,那不难理解...)。我不知道他们最近是否已经删除了它,但我肯定不会依赖任何android.R.*资源。我现在已经在许多旧版Android应用程序中工作过了,所以我不需要文档来说明它。有了对我的资源的“内部”控制,我睡得更加安心...原因在答案中已经清楚地说明了。祝好运! - thelawnmowerman

4

返回键按下时,使用默认的Android动画的示例

 @Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
}

如果您要使用默认动画,应该使用android.R.anim.ANIMATIONNAME

。其中ANIMATIONNAME是具体的动画名称。


2
我成功地通过以下方式解决了这个问题:
static public int getResourceIdFromCurrentThemeAttribute(FragmentActivity activity, int attribute){
    TypedValue a = new TypedValue();
    activity.getTheme().resolveAttribute(attribute, a, false);
    return a.resourceId;
}

//This type of fragment will be opened like an activity
static public void openActivityLikeFragment(FragmentActivity activity, BaseFragment fragment, int containerId, String stackRef) {
    FragmentManager fm = activity.getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    //The fragment open/close transition should have the same animations as its activity
    ft.setCustomAnimations(
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenEnterAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenExitAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseEnterAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseExitAnimation)
    );
    ft.replace(containerId, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(stackRef);
    ft.commit();
}

这个解决方案比直接引用资源更安全,因为它引用的是一个属性,该属性在发出一些弃用警告之前不会更改。


1
好主意,但对我不起作用,我总是从resolveAttributes得到0,你使用的是哪个主题? - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接