Android:覆盖暂挂活动主题对话框的转换不起作用

时间:2014-02-15 19:04:29

标签: android animation dialog themes transition

我一直在开发Android应用程序,我需要为我的活动制作动画。我使用了overridePendingTransition(entr,exit)并在res \ anim文件夹中制作了3个xml文件。 r push_up_in.xml,push_down_out.xml,hold.xml 使用

<set>
  <translate>
     duration, fromYDelta, toYDelta, zAdjustment
</set>

我为 push_.xmls 保留 zAdjustment = top ,为hold.xml保留底部。一切正常,当我startactivity(myIntent) and finish()我的活动时,动画在这两种情况下都能完美无瑕。 但是当我将活动主题从 AndroidManifest.xml 文件更改为“Theme.Dialog”时,overridePendingAnimation on MyActivity.this.finish();永远不会有效。这意味着我的动画在我开始活动时起作用,但在完成活动时不起作用。

的AndroidManifest.xml

<activity
        android:name=".MyActivity"
        android:label="My Activity"
        android:theme="@android:style/Theme.Dialog">
</activity>

如果我只是删除“主题”声明,那么一切都会像魅力一样开始。

<activity
        android:name=".MyActivity"
        android:label="My Activity">
</activity>

但我希望我的活动看起来像一个对话框。

2 个答案:

答案 0 :(得分:2)

我在Android 4.4.2中遇到了同样的问题。 Theme.Dialog 定义了一个默认的非常短的退出动画,可快速缩小对话框并将其淡化为透明。在对话框上调用overridePendingTransition(entr,exit)会运行您与 Theme.Dialog 动画同时指定的退出动画,而不是替换它。此外,当 Theme.Dialog 动画完成时,您指定的动画会意外终止,即使您的动画要长得多。如果仔细观察,您可能会注意到您的退出动画实际上已开始运行但在50-100ms后终止。

这似乎是一个Android错误,但我找到了一个解决方法。您需要将 Theme.Dialog 退出动画替换为定义为XML样式的虚拟动画。例如,在res / anim文件夹中创建一个名为no_animation.xml的文件,其中包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1.0"
    android:toAlpha="1.0"
    android:duration="500" />

然后将以下内容添加到您的res / style文件中:

<style name="NoDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/no_animation</item>
    <item name="android:windowExitAnimation">@anim/no_animation</item>
</style>

现在,您可以通过以下任一方式使用NoDialogAnimation替换默认的 Theme.Dialog 动画:

选项1.创建名为MyDialogStyle的新样式,如下所示:

<style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/NoDialogAnimation</item>
</style>

然后将此行添加到清单文件中的活动:

android:theme="@style/MyDialogStyle"

选项2.将以下行添加到您的活动的onCreate():

getWindow().getAttributes().windowAnimations = R.style.NoDialogAnimation;

您在overridePendingTransition(entr,exit)中指定的退出动画现在应该运行500毫秒,因为这是NoDialogAnimation的持续时间。您可能想知道为什么不将您想要的动画指定为样式而不是调用overridePendingTransition。好吧,如果你这样做,默认的 Theme.Dialog 动画将首先神奇地运行,即使你更换了它,那么你的动画将在中途和完成中获取。就像我之前说过的,这看起来像是一个Android bug。

最后说明: 我建议指定noDialogAnimation持续时间比您在实际退出动画中指定的持续时间少约50ms。原因是动画似乎没有同步。如果您的动画首先完成,对话框将在它消失之前反弹回其原始位置几毫秒。减去50ms似乎可以避免这个问题。

答案 1 :(得分:2)

这是一个老问题,但这对我有用。我在v4.2.2设备上遇到了这个问题,它是由Theme.Dialog中的默认窗口动画样式引起的,正如Dan建议的那样。您需要做的就是通过自定义主题来简单地摆脱它:

<style name="CustomTheme" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:windowEnterAnimation">@null</item>
    <item name="android:windowExitAnimation">@null</item>
    <!-- other customizations -->
</style>

我将android:windowEnterAnimation和android:windowExitAnimation设置为null,以防万一。现在你必须在清单中使用你的自定义主题,你就完成了:

<activity
    android:name=".MyActivity"
    android:label="My Activity"
    android:theme="@style/CustomTheme">
</activity>