Android FragmentTransaction.setCustomAnimations()不';当节电器打开时,它不工作

Android FragmentTransaction.setCustomAnimations()不';当节电器打开时,它不工作,android,animation,fragment,battery-saver,Android,Animation,Fragment,Battery Saver,我在片段之间的转换上使用自定义动画(从左到右滑动)。但当调用FragmentTransaction.commit()后电池节电器打开时,不会显示第二个片段 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); ft.replace(R.id.fragmen

我在片段之间的转换上使用自定义动画(从左到右滑动)。但当调用FragmentTransaction.commit()后电池节电器打开时,不会显示第二个片段

    FragmentTransaction ft = getFragmentManager().beginTransaction();

    ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
    ft.replace(R.id.fragment_help_container, newFragment);
    // Start the animated transition.
    ft.commit();
这是我在LogCat中发现的与此问题相关的内容

    02-18 20:33:26.908 932-932/? E/Icon: Unable to load resource 0x00000000 from pkg=
            android.content.res.Resources$NotFoundException: Resource ID #0x0
            at android.content.res.Resources.getValue(Resources.java:1351)
            at android.content.res.Resources.getDrawable(Resources.java:804)
            at android.graphics.drawable.Icon.loadDrawableInner(Icon.java:313)
            at android.graphics.drawable.Icon.loadDrawable(Icon.java:269)
            at android.widget.RemoteViews$TextViewDrawableAction.apply(RemoteViews.java:1502)
            at android.widget.RemoteViews.performApply(RemoteViews.java:2804)
            at android.widget.RemoteViews.apply(RemoteViews.java:2764)
            at android.widget.RemoteViews$ViewGroupAction.apply(RemoteViews.java:1373)
            at android.widget.RemoteViews.performApply(RemoteViews.java:2804)
            at android.widget.RemoteViews.reapply(RemoteViews.java:2795)
            at com.android.systemui.statusbar.BaseStatusBar.updateNotificationViews(BaseStatusBar.java:2064)
            at com.android.systemui.statusbar.BaseStatusBar.updateNotification(BaseStatusBar.java:1939)
            at com.android.systemui.statusbar.BaseStatusBar$6$2.run(BaseStatusBar.java:487)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
在\u left.xml中滑动\u

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

</set>

滑出\u right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="0"
    android:valueTo="-1.0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

</set>

在大多数情况下,删除该设置似乎对我有效。当设备处于电池模式时,objectAnimator看起来就像一个noOp,这样你就不会有漂亮的动画,但你不必担心任何复杂的问题。如果需要设置更复杂的动画(例如同时进行淡入和平移),则可能需要添加辅助方法来设置自定义动画。在我的例子中,我实际上有一个应该在中设置动画的视图,只是因为设置的原因而没有显示出来

    /**
 * NOTE: on lollipop+ the battery save screws with the animations. in most cases its fine but in some it actually prevents
 * the fragment from displaying. because of that I am creating this helper that must always be used
 */
public static void setCustomAnimation(Activity activity, FragmentTransaction transaction, int enter, int exit, int popEnter, int popExit)
{
    PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
            && powerManager.isPowerSaveMode())
    {
        return;
    }
    transaction.setCustomAnimations(enter, exit, enter, exit);
}

在大多数情况下,卸下电视机似乎对我有效。当设备处于电池模式时,objectAnimator看起来就像一个noOp,这样你就不会有漂亮的动画,但你不必担心任何复杂的问题。如果需要设置更复杂的动画(例如同时进行淡入和平移),则可能需要添加辅助方法来设置自定义动画。在我的例子中,我实际上有一个应该在中设置动画的视图,只是因为设置的原因而没有显示出来

    /**
 * NOTE: on lollipop+ the battery save screws with the animations. in most cases its fine but in some it actually prevents
 * the fragment from displaying. because of that I am creating this helper that must always be used
 */
public static void setCustomAnimation(Activity activity, FragmentTransaction transaction, int enter, int exit, int popEnter, int popExit)
{
    PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
            && powerManager.isPowerSaveMode())
    {
        return;
    }
    transaction.setCustomAnimations(enter, exit, enter, exit);
}

我有一个类似的问题没有崩溃,但我的碎片没有出现。我发现,如果动画使用的是集合动画师,那么它始终不工作,但是如果它是一个没有集合的简单对象动画师,那么它工作得很好。你能把你的幻灯片放在左边和右边吗?是的,我用的是set元素,增加了文件的内容。那么我需要改变什么呢?删除set元素并将objectAnimator作为根元素?我有一个类似的问题,没有崩溃,但我的片段没有出现。我发现,如果动画使用的是集合动画师,那么它始终不工作,但是如果它是一个没有集合的简单对象动画师,那么它工作得很好。你能把你的幻灯片放在左边和右边吗?是的,我用的是set元素,增加了文件的内容。那么我需要改变什么呢?移除集合元素并使objectAnimator成为根元素?我移除了集合,但片段仍然消失,所以我最终得到的解决方案与您提出的解决方案相同。@John有什么想法吗?我移除了集合,但片段仍然消失,所以我最终得到的解决方案与您提出的解决方案相同。@John有什么想法吗?