6

我有几个片段可以替换另一个片段。这些片段的 UI 发生了变化,我需要保持它的新状态。所以代码看起来很简单:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    if (mStepTwo == null) {
        mStepTwo = new QuizStepTwo();
        mStepTwo.setListener(mStepTwoListener);
    } else {
        fragmentTransaction.remove(mStepTwo);
    }

    fragmentTransaction.replace(R.id.step_holder, mStepTwo);
    fragmentTransaction.addToBackStack("second_step");

    fragmentTransaction.commit();

但是,当我用第一步替换第二步时,例如按下后退按钮,它的 UI 状态会回滚到初始状态。

我如何保持状态?OnSaveInstanceState ?或者更舒服的东西?

类似的问题:Android Fragment view state within a tab host , How to restore Android Fragment view state

4

5 回答 5

3

我没用过这个,所以里程可能会有所不同。您可以尝试FragmentManager.saveFragmentInstanceState在替换 Fragment 时使用该方法,然后Fragment.setInitialSavedState在恢复 Fragment 时使用该方法。从文档中,听起来它可能仅在制作相同类型的新片段时才有效,因此不确定这是否适用于您当前的实现。

于 2013-01-06T11:08:07.260 回答
2

这个问题(及其解决方案)看起来与您尝试做的类似。

但是,我能想到的一个替代解决方案不是用第二个片段替换第一个片段,而是隐藏它(用fragmentTransaction.hide()),或者分离。这样,当用户按下片段时BACK,片段将被显示并且其状态将保持不变。它可能需要更多内存,但它应该仍然可以工作,因为片段不会被破坏。

于 2013-01-06T06:44:04.930 回答
1

如果状态取决于您的应用数据,最好将它们保存在 SharedPreferences 文件中并使用它来构建 UI 元素。

于 2012-12-29T09:36:29.060 回答
1

看一下片段文档示例

您可以使用 onSaveInstanceState 方法来存储您的状态

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("curChoice", mCurCheckPosition);
}

然后在 onActivityCreated 回调中检索它

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        // Restore last state for Fragment documentation examplechecked position.
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
    }
}
于 2013-01-05T05:16:13.547 回答
0

add 和 replace 的区别在于我们添加前一个片段时不会暂停或停止。当我们尝试替换一个片段时,前一个片段会经历一个暂停和停止的循环。但是当我们将其放入堆栈时,前一个片段将保存在堆栈顶部。并且在诸如 back-press 之类的事件上被检索和加载。

因此,如果您的解决方案需要您的 UI 永远不会停止或卸载,您应该将其隐藏并在其顶部添加一个片段。或者如果可以卸载片段并且可以使用某种类型的参数重新生成 UI。因此,您可以在片段内存本身中有一些参数来确定它应该保存哪些统计信息。默认情况下,它将尝试保持一些默认状态。但是休息一下,您可以创建对象并将其附加到片段。

至于onSaveInstanceState,它会在包含fragment的activity关闭时调用,例如home press等事件。

例如

public class MainActivityFragment1 extends Fragment {
    int alreadyCreated = 0;

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

        if (alreadyCreated == 1) { // restoreLayout();
            Log.i("MainActivity", " Fragment already created and can be restored Fragment 1");
        }else
            Log.i("MainActivity", " Running Once Fragment 1");

        alreadyCreated = 1;


    01-07 16:08:07.009: I/MainActivity(14722):  Running Once Fragment 1
    01-07 16:08:09.239: I/MainActivity(14722):  MainActivity I on pause
    01-07 16:08:09.239: I/MainActivity(14722):  MainActivity I on stop
    01-07 16:08:09.239: I/MainActivity(14722):  Running Once Fragment 2
    01-07 16:08:13.499: I/MainActivity(14722):  Back Pressed
    01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on pause
    01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop

01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop
01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop
01-07 16:08:13.619: I/MainActivity(14722):  Fragment already created and can be restored Fragment 1
于 2013-01-07T10:40:41.390 回答