Режим STAMINA прерывает загрузку фрагментов с помощью настраиваемых анимаций

Этот код работает как ожидалось на всех устройствах, кроме устройств Sony с активированным режимом STAMINA:

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();

В режиме STAMINA первый фрагмент загружается нормально, но следующий не отображается вообще (экран остается черным). Если я прокомментирую метод setCustomAnimations, транзакция работает так, как ожидалось. Что происходит здесь, как заставить транзакцию работать с активированным режимом STAMINA?

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>

РЕДАКТИРОВАТЬ: решить самостоятельно, см. ниже

Ответ 1

Я использовал метод Roman Nurik для анимации Fragments. Если режим STAMINA активирован, анимации отключены, а метод setXFraction вызывается только один раз с конечным значением анимации. Ширина View равна 0 в этот момент, поэтому она никогда не будет размещена в правильном положении.

Решение состоит в том, чтобы отложить размещение до завершения компоновки:

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