这是否可以在再次调用fragment的同时恢复fragment UI中的数据状态



如果我有片段A和片段B。我使用以下代码从A调用片段B

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

fragmentTransaction.add(R.id.frame_step, fragment,TAG).hide(SourceFragment.this).addToBackStack((SourceFragment.class.getName()));
fragmentTransaction.commit();

现在在片段B中,我有EditText&我在里面输入了"你好",如果我从片段B按下后退按钮,那么根据getSupportFragmentManager().popBackStack();,它将恢复片段A

现在,如果我再次从片段A调用片段B,我希望片段B不会再次被创建,并且我仍然可以在EditText中看到"Hello"。

注意——我不想使用变量或共享pref,因为我有多个片段和多个视图,就像一个大表单一样。有没有什么可以从它的恢复状态调用片段,而不是再次调用它,或者我是否可以检查这个片段是否已经创建。提前感谢

您想要的是可能的。您需要在前向导航之前保存片段状态,并在从后台恢复片段后恢复它。

片段内

private Bundle savedState = null;
@Override
public void onDestroyView() {
super.onDestroyView();
savedState = saveState();
}
private Bundle saveState() { /* called either from onDestroyView() or onSaveInstanceState() */
Bundle state = new Bundle();
state.putCharSequence("TEXT_HELLO_WORD", helloWordTextView.getText());
return state;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/* (...) */
if(savedInstanceState != null && savedState == null) {
savedState = savedInstanceState.getBundle("FRAGMENT_HELLO_WORD");
}
if(savedState != null) {
helloWordTextView.setText(savedState.getCharSequence("TEXT_HELLO_WORD"));
}
savedState = null;
/* (...) */
return view;
}
...
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's state here somehow like this
outState.putBundle("FRAGMENT_HELLO_WORD", (savedState != null) ? savedState : saveState());
}

活动

public void onCreate(Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
//Restore the fragment's instance
mContent = getSupportFragmentManager().getFragment(savedInstanceState, "myFragmentName");
...
}
...
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's instance
getSupportFragmentManager().putFragment(outState, "myFragmentName", mContent);
}

从这里和这里编译的答案

希望能有所帮助。

2019年实现这一目标的最佳方法是使用支持片段的共享视图模型。如果数据在片段之间共享,则可以随时从ViewModel访问任何片段中的数据。我们唯一需要记住的是在活动上下文中初始化ViewModel。参考https://developer.android.com/topic/libraries/architecture/viewmodel#sharing

最新更新