ActivityOptionsCompat在android 2.3中不起作用

chi*_*dev 3 android android-support-library

我使用Activity支持-v4库最近支持的ActivityOptionsCompat和ActivityCompat实现了窗口动画.

我使用下面的代码实现动画:

Intent subActivity = new Intent(WindowAnimations.this,
                    AnimatedSubActivity.class);
            // The enter/exit animations for the two activities are
            // specified by xml resources
            Bundle translateBundle = ActivityOptionsCompat
                    .makeCustomAnimation(WindowAnimations.this,
                            R.anim.slide_in_left, R.anim.slide_out_left)
                    .toBundle();
            ActivityCompat.startActivity(WindowAnimations.this,
                        subActivity, translateBundle);
Run Code Online (Sandbox Code Playgroud)

上面的代码在android 4.3和4.0中运行良好.

任何人都能够在2.X中工作吗?任何帮助表示赞赏.

MH.*_*MH. 10

@Luksprog基本上已经在你的问题的第一个回答了这个问题,但是这里有更多的文档来进一步支持这个说法.

首先,仔细阅读javadoc .我突出了一些相关的关键字:ActivityCompat#startActivity(Activity activity, Intent intent, Bundle options)

如果能够,请使用其他启动信息启动活动.

在Android 4.1+中,引入了其他选项以允许更多地控制活动启动动画.应用程序可以将此方法与ActivityOptionsCompat一起使用,以便在可用时使用这些动画.在不存在此功能的平台版本上运行时,活动将正常启动.

所以这基本上告诉我们(可选)动画功能只适用于原生支持它的Android版本.在所有其他平台版本中,Activity将"正常"启动 - 即没有可选动画.

实际证据可以在以下源代码中找到ActivityCompat:

public static void startActivity(Activity activity, Intent intent, Bundle options) {
    if (Build.VERSION.SDK_INT >= 16) {
        ActivityCompatJB.startActivity(activity, intent, options);
    } else {
        activity.startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说:如果这个代码在pre-JB设备上执行,那么普通的旧startActivity()调用就会生气,其中options参数会被忽略.只有JB设备最终会使用它.

也许多余的提及,但显然同样适用于startActivityForResult()对应方.

总结一下:目前支持库只提供了一个静态助手类,以"向后兼容的方式"执行某些功能- 它实际上并没有向后移植该功能.它在这个阶段所做的就是节省你必须if/else在你自己的应用程序中写入条件.

话虽如此,当前的实现确实允许未来的实际功能的后端口.这也可能是ActivityOptionsCompat班级存在的原因.现在,该类为前置JB设备提供了一个"空"实现,从理论上讲,它可以在以后阶段"填充".通过这些兼容性帮助程序调用的任何代码将自动开始工作.

ActivityOptionsCompat返回空实现调用示例:

public static ActivityOptionsCompat makeCustomAnimation(Context context,
        int enterResId, int exitResId) {
    if (Build.VERSION.SDK_INT >= 16) {
        return new ActivityOptionsImplJB(
            ActivityOptionsCompatJB.makeCustomAnimation(context, enterResId, exitResId));
    }
    return new ActivityOptionsCompat();
}
Run Code Online (Sandbox Code Playgroud)