【问题标题】:STAMINA mode breaks fragment loading with custom animationsSTAMINA 模式通过自定义动画中断片段加载
【发布时间】:2017-01-04 18:38:51
【问题描述】:

此代码在所有设备上都按预期工作,除了激活 STAMINA 模式的 Sony 设备:

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 模式下,第一个 Fragment 正常加载,但下一个 Fragment 根本不显示(屏幕保持黑色)。如果我注释掉 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>

编辑:自己解决,见下文

【问题讨论】:

    标签: android android-fragments fragmenttransaction sony-xperia


    【解决方案1】:

    我使用Roman Nurik's methodFragments 设置动画。如果激活了 STAMINA 模式,动画将被禁用,并且 setXFraction 方法仅使用动画的结束值调用一次。 View此时的宽度为0,所以它永远不会放在正确的位置。

    解决方法是延迟放置,直到布局完成:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      相关资源
      最近更新 更多