我有一个奇怪的问题让我发疯!
场景:
我有活动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和屏幕旋转所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)