【问题标题】:How can I retain my layout in an android fragment on configuration change?如何在配置更改时将布局保留在 android 片段中?
【发布时间】:2013-08-19 09:10:28
【问题描述】:

我遇到了以下问题。我试图在配置更改时保留我的片段之一的布局。因此我想,我可以使用setRetainInstance(true)。然而,事实证明它不起作用。问题是,每次配置更改时都会调用onCreateView,以便我的布局重置为初始状态。

我可以做些什么来保留我的布局? 我是否必须将我的代码移动到 onCreateView 内的其他地方?

请注意:我不能使用 android:configChanges="orientation" 清单中的 hack,因为我的标签托管活动托管了更多标签。我只想在一个标签中保留状态。

这是我的一些代码:

public class MyFragment extends SherlockFragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);   
    setRetainInstance(true);
    View rootView = inflater.inflate(R.layout.abc, container, false);

    // Some more code that was omitted ..

    return rootView;
}
}

【问题讨论】:

  • 您不应该在 可见 片段上使用setRetainInstance(),因为如果重新创建拥有的活动,您将泄漏对前一个活动的引用。
  • @AlexMDC 我应该怎么做才能将我的布局保留在可见片段中?
  • 您所描述的内容应该会自动工作,即使片段是与拥有的活动一起重新创建的。如果您删除 setRetainInstance() 调用并让片段恢复到其默认行为会发生什么?视图恢复时布局有什么问题?
  • 问题在于配置更改不会保留运行时设置的数据
  • 在这种情况下,您需要自己在配置更改期间保留数据。在你的活动中使用onRetainNonConfigurationInstance(),或者使用加载器来持久化数据,或者使用你称为setRetainInstance()的不可见片段(即没有视图)。涉及一些管道,但这是 Android 方式:)

标签: android view android-fragments oncreate


【解决方案1】:

你称之为“hack”的东西实际上并不是...... android:configChanges="orientation" 在你的清单中只是告诉 Android 框架,而不是方向更改的默认行为(关闭并重新启动你的应用程序,导致 @ 987654324@ 在您的Fragment 中也将被调用),您将在您的应用程序中自己处理方向更改。

它不做的(当然)是实现您想要的行为(即保持您的选项卡布局之一不变)。这您必须自己做,例如将所有其他布局替换为特定的纵向/横向布局,但保持特定选项卡不变。您在ActivityonConfigurationChanged() 回调中实现此行为,顺便说一下,只有在您在清单中设置android:configChanges 后才会调用它。

【讨论】:

  • 你读过这篇文章androiddesignpatterns.com/2013/04/…吗?他将其描述为一种 hacky
  • 在您链接到它的帖子中被描述为 hacky,因为在这种情况下,您使用 configchanges 清单属性来防止应用程序销毁/创建周期以维护一些通用应用程序状态。 configchanges 属性只能用于设计的情况,即developer.android.com/reference/android/… 中描述的属性更改。这包括更改屏幕方向。
  • 从您得到的原始问题的 cmets 中:请注意,您的问题要求一种方法来保留您的 LAYOUT。它没有提到任何关于保留表单数据的内容,从您的 cmets 来看,这是您的实际目标。在这种情况下,我会说:确保您正确实施 onSaveInstanceState() 并在重新初始化您的应用程序时重新加载您的数据,就像 Alex 在他的评论中所说的那样。从性能的角度来看,保留布局有时是有益的,但与正确处理数据的持久性无关!
猜你喜欢
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多