2016-02-18 2 views
0

Я использую пользовательскую анимацию (скользящую слева направо) при переходе между фрагментами. Но когда включена функция экономии заряда аккумулятора после вызова FragmentTransaction.commit(), второй фрагмент не отображается.FragmentTransaction.setCustomAnimations() не работает при включенной батареей

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) 

slide_in_left.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="1.0" 
    android:valueTo="0" 
    android:propertyName="xFraction" 
    android:duration="@android:integer/config_mediumAnimTime" /> 

</set> 

slide_out_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> 
+0

У меня такая же проблема без аварии, но мои фрагменты не отображаются. Я обнаружил, что если анимация использует установленный аниматор, который он последовательно не работает, но если это простой объектАниматор без установленного, то он отлично работает. Можете ли вы разместить файлы slide_in_left и slide_out_right? –

+0

Да, я использую set element, добавлено содержимое файлов. Так что мне нужно изменить? Удалить элемент set и сделать objectAnimator в качестве корневого элемента? –

ответ

2

Удаление набора, казалось, работали в большинстве случаев для меня. Когда устройство находится в режиме батареи, объектАниматор, похоже, ведет себя как 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); 
} 
+0

Я удалил набор, но фрагменты все еще исчезают, поэтому я оказался в том же решении, которое вы предложили. –

+0

@John любые мысли на [это] (http://stackoverflow.com/questions/38483783/valueanimator-doesnt-work-as-expected-when-battery-saver-is-enabled-api-21)? –

Смежные вопросы