当片段时保存其状态FragmentTransaction.Replace?(Where Fragme

2019-08-20 02:51发布

背景:我有在右边左边的菜单,以及不同的滚动内容。 我想保存的滚动位置。 但我失败了。 然后 ...

我已经建立了一个非常简单的项目进行测试。

在的话,我有左边的菜单,并且不同的内容全部保持一个<EditText>在右边。 (尽管是同一类的,它们是不同的实例)

在代码,(很简单)

content.xml文件

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Please save my text ..." />

ContentFragment.java

package ... import ...

public class ContentFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.content, container, false);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        System.out.println("Why this is NOT called ?");
        Log.v("onSaveInstanceState()", "outState = " + outState);
    }
}

和程序生成MenuFragment.java

package ... import ...

public class MenuFragment extends ListFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[]{"Item 1", "Item 2", "Item 3"}));
    }
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        ((MainActivity) getActivity()).click();
    }
}

最后,我们MainActivity.java

package ... import ...

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null)
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.menu, new MenuFragment()).commit();
    }
    public void click() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, new ContentFragment()  // everytime load a new instance
                ).addToBackStack(null).commit();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        System.out.println("... and this is NOT called neither :-/");
        Log.v("onSaveInstanceState()", "outState = " + outState);
    }
}

为了测试它,请不要旋转你的设备。

首先,从菜单中选择一个项目,然后在文本框中键入一些东西。 然后选择其他项目,并再次键入一些东西。 重复几次。 然后再返回,并...

你会发现以前输入的文本保存!

这是不奇怪的是,文本保存...

惊讶文本保存了所有onSaveInstanceState()函数没有被调用。

什么时候的Android救他们,而replacedFragmentTransaction

如果我想还保存一些数据在每个Fragment实例(如滚动位置),我应该在哪里把我的代码?

Answer 1:

默认情况下,EDITTEXT保存自己的实例。 见雅拉T.的答案。

如何留住与方向变化的EditText数据?



文章来源: Where Fragment save its State when FragmentTransaction.Replace?