0

Ce code fonctionne comme prévu sur tous les appareils, à l'exception des appareils Sony avec le mode ENDURANCE activé:mode STAMINA casse chargement fragment avec des animations personnalisées

int backStackCount = getSupportFragmentManager().getBackStackEntryCount();  
getFragmentManager() 
       .beginTransaction() 
       .setCustomAnimations(backStackCount == 0? R.animator.noanim : R.animator.slide_in, 
         R.animator.zoom_out, R.animator.zoom_in, backStackCount == 0? R.animator.noanim : R.animator.slide_out) 
       .replace(R.id.container, fragment, String.valueOf(backStackCount)) 
       .addToBackStack(fragment.getClass().toString()) 
       .commit(); 

Avec le mode STAMINA le premier fragment est chargé normalement, mais le prochain fait n'apparaît pas du tout (l'écran reste noir). Si je commente la méthode setCustomAnimations, la transaction fonctionne comme prévu. Que se passe-t-il ici, comment faire fonctionner la transaction avec le mode STAMINA activé?

R.animator.slide_in:

<?xml version="1.0" encoding="utf-8"?> 
<set> 
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
        android:interpolator="@android:anim/decelerate_interpolator" 
        android:valueFrom="1.0" 
        android:valueTo="0" 
        android:propertyName="xFraction" 
        android:duration="@android:integer/config_mediumAnimTime" /> 
</set> 

EDIT: résolu par moi-même, voir ci-dessous

Répondre

0

je Roman Nurik's method pour animer le Fragments. Si le mode STAMINA est activé, les animations sont désactivées et la méthode setXFraction est appelée une seule fois avec la valeur de fin de l'animation. La largeur du View est 0 en ce moment, donc il ne sera jamais placé à la bonne position.

La solution est de retarder la mise en place jusqu'à ce que la mise en page est terminée:

public void setXFraction(float xFraction) { 
    this.xFraction = xFraction; 
    post(() -> { 
     final int width = getWidth(); 
     setX((width > 0) ? (this.xFraction * width) : -9999); 
    }); 
}