0

我有一个应用程序。那是使用片段。主要活动以 2 个片段开始。其中一个片段包含一个按钮,用于在运行时添加第三个片段,如下所示:

button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Activity activity = getActivity();

            if (fragment3 == null) {
                getFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_content3, new ThirdFragment())
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .commit();
        }

ThirdFragment 类如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(getTag(), "FRAG onCreate CALLED!");
    this.setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.third_fragment, container, false);
return view;

问题是我无法理解如何在重新创建 Activity 时保持该片段的视图不被删除。我试图@Override onCreate() 方法并使用 setRetainInstance(true) 无济于事。

所以,我的问题是:

当重新创建 Activity 时,保持动态(在运行时)添加的 Fragment 不被删除的正确方法是什么?

4

1 回答 1

0

在这种情况下,您可以通过实现一个额外的回调方法来确保保留有关活动状态的重要信息,该方法允许您保存有关活动状态的信息:onSaveInstanceState().

onSaveInstanceState()在使活动易受破坏之前系统调用。系统将此方法传递给一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法将有关活动的状态信息保存为名称-值对。然后,如果系统终止了您的应用程序进程并且用户导航回您的活动,系统将重新创建活动并将 Bundle 传递给onCreate()onRestoreInstanceState()。使用这两种方法中的任何一种,您都可以从 Bundle 中提取保存的状态并恢复活动状态。如果没有要恢复的状态信息,那么传递给你的Bundle就是null(第一次创建activity时就是这种情况)。安卓文档

解决方案:

因此,您只有一个 bundle inside 方法onSaveInstanceState()来保存有关您的片段的信息,并且由于片段是一个复杂的对象,您不能将它直接存储在 bundle 中。

我的建议是@overrideonSaveInstanceState()并使用一个boolean标志来指示您的第三个片段是否应该附加(可见)。很快,您可以使用OnCreate() or onRestoreInstanceState()并获取包来读取您的标志,并根据它,您可以创建或不创建您的片段。

于 2013-04-26T13:27:37.103 回答