【问题标题】:Fragments And Configuration Change片段和配置更改
【发布时间】:2019-09-10 11:59:29
【问题描述】:

我试图了解发生配置更改时片段的行为。 我创建了一个项目,其中一个活动将在onCreate() 中托管一个片段:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState==null) {
        mFragment1 = new Fragment1();
        mManager = getFragmentManager();
        mManager.beginTransaction().add(R.id.container_1, mFragment1, null)
                .add(R.id.container_1, mFragment1, null)
                .commit();
    }
}

如果事务仅在 savedInstanceState 为 null 时发生,并且活动和片段被销毁并重新创建,为什么我的活动在设备旋转时再次托管片段? 我的观点是:如果在旋转后保存的实例状态不为空,为什么片段管理器会再次添加片段?

谢谢。

【问题讨论】:

  • Fragments 有自己的生命周期,但它总是嵌入到一个 Activity 中,因此 Fragments 的生命周期直接受到宿主 Activity 生命周期的影响
  • 如果你没有保存任何onSaveInstance回调,那么savedInstance将为空,因此片段事务再次发生。
  • 例如:方向变化是触发这个生命周期的配置变化。基于此:这取决于您是否在清单中使用android:configChanges="orientation"。如果你这样做了,一切都将保持不变,视图只是重新布局自己。如果没有,Activity 和 Fragment 将使用它们保存的实例重新创建,您可以将其覆盖为 onSaveInstanceState(Bundle outState)
  • 我的观点是:如果在rotation后saveinstancestate不为null,为什么fragment manager还要重新添加fragments?

标签: java android fragment


【解决方案1】:

我相信你要找的东西在这里 https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

如果你想知道快捷方式就放

setretaininstance(true);

片段内部。

【讨论】:

    【解决方案2】:

    Fragments 有它自己的生命周期,但它总是嵌入到一个 Activity 中,因此 Fragments 的生命周期直接受到宿主 Activity 的生命周期的影响。

    我认为这会有所帮助:当您旋转设备并且屏幕改变方向时,Android 通常会破坏应用程序的现有活动和片段并重新创建它们。 Android 这样做是为了让您的应用程序可以根据新配置重新加载资源。

    如果你像下面这样使用SaveInstanceState,那么它的值是保持不变的,并且不会为null,你可以处理。

        @Override
        public void onSaveInstanceState(Bundle outState){
            super.onSaveInstanceState(outState);
            outState.putString(savedName, name);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2012-02-08
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多