java - 再次调用fragment时是否可以恢复fragment UI中数据的状态?

标签 java android state restore

如果我有 fragment A 和 fragment B。我使用以下代码从 A 调用 fragment 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();

现在在 fragment B 中,我有 EditText 并且已在其中输入“Hello”,如果我按 fragment B 的后退按钮,则根据 getSupportFragmentManager().popBackStack(); 它将恢复 fragment A

现在,如果我再次从 fragment A 调用 fragment B,我希望 FragmentB 不会再次创建,并且我仍然可以在 EditText 中看到“Hello”。

注意 - 我不想为此使用变量或共享首选项,因为我有多个具有多个 View 的 fragment ,例如大表单。有没有什么可以从恢复状态调用 fragment 而不是再次调用它,或者我是否可以检查该 fragment 是否已经创建。 提前致谢

最佳答案

你想要的都是可能的。您需要在向前导航之前保存 Fragment 状态,并在从 Backstack 恢复 Fragment 后恢复它。

在 fragment 中

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());
}

在 Activity 中

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);
}

答案编译自herehere

希望有帮助。

关于java - 再次调用fragment时是否可以恢复fragment UI中数据的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854790/

相关文章:

java - 使用 Java 裁剪图像

java - ODBC 登录尝试使用 Windows 身份验证,即使我提供了 SQL Server 凭据

java - 玩法2 GET方法最大长度

android - 无法在 TableRow 中动态居中 TextView

javascript - react : Encountered two children with the same key

flutter - 在FutureProvider中初始化StateProvider

java - 关于样式为 SWT.CALENDAR 的 DateTime 小部件

android - 如何在 Activity 启动时显示 "Sliding Menu"?

java - 无法在未调用 Looper 的线程内创建处理程序

reactjs - 如何使用文件对象设置状态