android–SupportFragmentManager,popbackstack和屏幕旋转

android–SupportFragmentManager,popbackstack和屏幕旋转,第1张

概述我有一个奇怪的问题让我发疯!场景:我有活动A作为启动器活动和活动B可以通过活动A中的意图启动ActivityA-->ActivityB活动B有一个初始的Fragment调用它片段C它在ActivityB中被实例化,如下所示:if(getSupportFragmentManager().findFragmentByTag(FragmentC.TAG)==null)

我有一个奇怪的问题让我发疯!

场景:

我有活动A作为启动器活动和活动B可以通过活动A中的意图启动

Activity A --> Activity B

活动B有一个初始的Fragment调用它片段C它在Activity B中被实例化,如下所示:

if(getSupportFragmentManager().findFragmentByTag(FragmentC.TAG) == null) {        getSupportFragmentManager()                 .beginTransaction()                 .add(R.ID.container,                  FragmentC.newInstance(null), // optional bundle                  FragmentC.TAG)                 .commit();}

在Fragment中,CI在VIEwHolder上有一个带有OnClickListener的RecyclerVIEw,它通过片段C回调到托管活动B.此时我启动FragmentTransaction(在活动B中)替换当前的Fragment C,称之为Fragment D,然后我将此事务添加到backstack:

getSupportFragmentManager()          .beginTransaction()          .setCustomAnimations(                  R.anim.fragment_slIDe_enter,                  R.anim.fragment_slIDe_exit,                  R.anim.fragment_slIDe_enter_pop,                  R.anim.fragment_slIDe_exit_pop)          .replace(R.ID.container,                        FragmentD.newInstance(bundle),                        FragmentD.TAG)          .addToBackStack(null)          .commit();

所以在这一点上,我有活动B与片段D,从后面的堆栈中的片段C到片段D的事务,处理背压如下:

@OverrIDepublic boolean onSupportNavigateUp() {    onBackpressed();    return true;}@OverrIDepublic voID onBackpressed() {    super.onBackpressed();}

导航正确地前进和后退,从开始行动A到行动B – >片段D和背部.

问题:

但是,如果我在Fragment D中并旋转屏幕,则d出backstack转到Fragment C(撤消事务)我会看到一个空白片段.更奇怪的是,所有Fragment C的生命周期方法OnCreate(),OnCreateVIEw(),OnActivityCreated()都被调用,并且我有有效的数据/对象(通过设置断点检查).

但奇怪的是,如果我从Fragment C进行添加交易 – >片段D,显然两者都是一次显示在一起,我旋转屏幕然后按回去删除事务没有问题,显然不是解决方案,只是一个观察.

我搜索过,但我读过和尝试的所有东西都不起作用.我之前已经实现了类似的东西,虽然工作正常但我在这里苦苦挣扎 – 任何帮助都会受到赞赏.

编辑

如果应用程序进入暂停状态(单独留下并且屏幕熄灭)然后再次唤醒,恢复,片段就会出现.我在onResume中没有初始化,所以我不知道为什么这样做.

解决方法:

您的问题是由于屏幕旋转而发生的.

根据文档,每次设备配置更改时,您的活动都将被销毁并重新创建,例如当用户旋转屏幕时.当屏幕更改方向时,系统会破坏并重新创建前台活动,因为屏幕配置已更改,您的活动可能需要加载其他资源(例如布局)

在这种情况下,您的活动B再次启动初始框架C,并且所有生命周期方法再次执行

>您可以在纵向模式下限制活动.
>您应该处理片段中的onConfigurationChanged()方法并定义setRetainInstance(true);在onCreateVIEw()中

public voID setRetainInstance(boolean retain)
控制是否在活动重新创建(例如从配置更改)中保留片段实例.这只能用于不在后栈中的片段.如果设置,则在重新创建活动时,片段生命周期会略有不同:

 @OverrIDe    public voID onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        // Checks the orIEntation of the screen for landscape and portrait        if (newConfig.orIEntation == Configuration.ORIENTATION_LANDSCAPE) {        } else if (newConfig.orIEntation == Configuration.ORIENTATION_PORTRAIT) {        }    }
总结

以上是内存溢出为你收集整理的android – SupportFragmentManager,popbackstack和屏幕旋转全部内容,希望文章能够帮你解决android – SupportFragmentManager,popbackstack和屏幕旋转所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1115776.html

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

发表评论

登录后才能评论

评论列表(0条)

保存