Android 动态删除片段并保存其UI转换

Android 动态删除片段并保存其UI转换,android,android-fragments,Android,Android Fragments,我有两个片段,一个替换另一个。这些片段的UI发生了变化,我需要保持它的新状态。所以代码看起来很简单: FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); if (mStepTwo == null) {

我有两个片段,一个替换另一个。这些片段的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?还是更舒服的


类似问题:,

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

请查看:

您可以使用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);
    }
}
看起来和你想做的很像


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

我没有使用过这个,所以里程数可能会有所不同。您可以尝试在替换片段时使用该方法,然后在恢复片段时使用该方法。从文档中可以看出,它可能只在创建相同类型的新片段时才起作用,因此不确定这是否适用于您当前的实现。

添加和替换之间的区别在于我们添加之前的片段时没有暂停或停止。当我们试图替换一个片段时,前一个片段经历了一个暂停和停止的循环。 但当我们把它放到堆栈中时,前面的片段保存在堆栈的顶部。并被检索和加载到事件中,如反压

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

对于onSaveInstanceState,当包含片段的活动关闭时(即home press之类的事件)将调用它

e、 g


这些用户界面的变化有多大?几个广播组的选择或类似的-实际上不算大。我不确定我是否理解你指的是什么状态。是否要保存已替换片段的状态,并在用户单击“上一步”按钮时显示该片段?或者,是否要保存片段的状态,该片段将通过单击“后退”按钮被销毁,以便在再次显示时可以恢复其UI?
已被替换,并将在用户单击“后退”按钮时可见。此时,我观察backstack更改,并从相关片段调用定制方法
restoreLayout
。有现成的平台解决方案吗?我还没有处理很多事务,但我希望Android能自动恢复状态。。。我想不会吧?请看我的答案。SharedReferences是关于IO操作的。如果我采用这种笨拙的方法,我最好使用普通的活动字段。我不是在破坏活动——只是用一个片段替换另一个片段。尽管意识到这行不通,我还是在一个非常简单的示例上尝试了它,但没有调用onSaveInstanceState,因为没有理由调用它(我没有关闭活动)。如果您有一个saveIntanceState的工作示例,请让我看看。谢谢
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