android – setRetainInstance(true)setCustomAnimations(…)=每个方向更改的动画?

android – setRetainInstance(true)setCustomAnimations(…)=每个方向更改的动画?,第1张

概述背景 我有一个活动,片段需要在创建时进行动画处理,但在方向改变时则不需要. 片段被动态插入到布局中,因为它是导航抽屉式活动的一部分. 问题 我想避免为配置更改重新创建片段,所以我在片段中使用了setRetainInstance. 它可以工作,但由于某种原因,每次旋转设备时动画也会重新启动. 我做了什么 我已将此添加到片段中: @Overridepublic void onCreate(final 背景

我有一个活动,片段需要在创建时进行动画处理,但在方向改变时则不需要.

片段被动态插入到布局中,因为它是导航抽屉式活动的一部分.

问题

我想避免为配置更改重新创建片段,所以我在片段中使用了setRetainInstance.
它可以工作,但由于某种原因,每次旋转设备时动画也会重新启动.

我做了什么

我已将此添加到片段中:

@OverrIDepublic voID onCreate(final Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setRetainInstance(true);}

这对活动:

final FragmentManager fragmentManager = getSupportFragmentManager();    final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();    MyFragment fragment= (MyFragment) fragmentManager.findFragmentByTag(MyFragment.TAG);    if (fragment== null) {        fragmentTransaction.setCustomAnimations(R.anim.slIDe_in_from_left,R.anim.slIDe_out_to_right);        fragment= new MyFragment();        fragmentTransaction                .add(R.ID.fragmentContainer,fragment,MyFragment.TAG).commit();    }

fragment_container.xml

<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:ID="@+ID/fragmentContainer"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent" />

我试过的

>我试图通过使用“替换”而不是“添加”来修复它.它没有帮助.
>我也尝试过总是执行片段的替换,如果片段已经存在,那就不用动画(在同一个片段上).
>如果我删除setRetainInstance调用,它可以工作,但我想避免重新创建片段.

>我该如何解决这个问题?
>为什么我仍然可以获得添加片段的动画?
>其他配置发生变化时会发生什么?

解决方法#1

这个解决方案通常有效,但它会给你试图实现的生命周期带来不好的结果:

MyFragment fragment= (MyFragment) fragmentManager.findFragmentByTag(MyFragment.TAG);    if (MyFragment== null) {        MyFragment= new MyFragment();        fragmentManager.beginTransaction().setCustomAnimations(R.anim.slIDe_in_from_left,R.anim.slIDe_out_to_right)                .replace(R.ID.fragmentContainer,MyFragment.TAG).commit();    } else {        //workaround: fragment already exists,so avoID re-animating it by quickly removing and re-adding it:        fragmentManager.beginTransaction().remove(fragment).commit();        final Fragment finalFragment = fragment;        new Handler().post(new Runnable() {            @OverrIDe            public voID run() {                fragmentManager.beginTransaction().replace(R.ID.fragmentContainer,finalFragment .TAG).commit();            }        });    }

我仍然希望看到可以做什么,因为这会导致你不想发生的事情(例如onDetach for the fragment).

解决方法#2

解决此问题的一种方法是避免通过fragmentManager添加动画,并在片段生命周期内为视图本身执行此 *** 作.
这是它的样子:

BaseFragment

@OverrIDepublic voID onVIEwCreated(final VIEw rootVIEw,final Bundle savedInstanceState) {    super.onVIEwCreated(rootVIEw,savedInstanceState);    if (savedInstanceState == null)        rootVIEw.startAnimation(AnimationUtils.loadAnimation(getActivity(),R.anim.slIDe_in_from_left));}@OverrIDepublic voID onDestroyVIEw() {    super.onDestroyVIEw();    if (!getActivity().isChangingConfigurations())        getVIEw().startAnimation(AnimationUtils.loadAnimation(getActivity(),R.anim.fade_out));}
解决方法 如果在旋转后重新创建片段,您如何覆盖 onCreateAnimation()方法并阻止动画发生?

如图所示:How to disable/avoid Fragment custom animations after screen rotation

编辑:这是一个示例代码:

BaseFragment.java

...private boolean mNeedToAvoIDAnimation;@OverrIDepublic voID onDestroyVIEw() {    super.onDestroyVIEw();    mNeedToAvoIDAnimation = true;}@OverrIDepublic Animation onCreateAnimation(int transit,boolean enter,int nextAnim) {    // This avoIDs the transaction animation when the orIEnatation changes    boolean needToAvoIDAnimation = mNeedToAvoIDAnimation;    mNeedToAvoIDAnimation = false;    return needToAvoIDAnimation ? new Animation() {    } : super.onCreateAnimation(transit,enter,nextAnim);}

此片段应该是此活动中所有片段将扩展的基础片段.

总结

以上是内存溢出为你收集整理的android – setRetainInstance(true)setCustomAnimations(…)=每个方向更改的动画?全部内容,希望文章能够帮你解决android – setRetainInstance(true)setCustomAnimations(…)=每个方向更改的动画?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1138814.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存