片段实例化:为什么saveInstanceState束不够用?

时间:2017-11-14 12:20:50

标签: android android-fragments

我一直在使用Google推荐的具有MyFragment.newInstance()静态功能的最佳做法。考虑到它,为什么我们不能简化它去除这个静态函数,调用onCreate来访问参数,并且只使用一个bundle来重新创建片段时总是保存和检索最新数据?
我做了一个简单的测试,看起来像稍微重一点的当前练习一样好 在FragmentStatePagerAdapter之后,状态在活动重新创建,方向更改和片段重新创建后持续存在 我错过了什么吗?

public class TestFragment extends Fragment {

    private String fragmentText;

    public TestFragment() { } // Required empty public constructor

    @SuppressLint("ValidFragment") 
    public TestFragment(String fragmentText) {
        // add here other init arguments 
        // don't save them in any bundle yet
        this.fragmentText = fragmentText;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            // retrieve all arguments here 
            fragmentText = savedInstanceState.getString("fragmentText", fragmentText);
        }
        TextView textView = new TextView(getActivity());
        textView.setText(fragmentText);
        return textView;
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        // save everything here once, only when needed
        outState.putString("fragmentText", fragmentText);
    }

    // Add your setters to interact with the fragment
    // those changes will persists after fragment re-creation
    public void setFragmentText(String fragmentText) {
        this.fragmentText = fragmentText;
    }
}

2 个答案:

答案 0 :(得分:1)

  

为什么saveInstanceState束不够用?

这就够了。参数Bundle会自动添加到已保存的实例状态Bundle

  

我做了一个简单的测试,似乎与稍微重一点的当前练习一样好。

就代码行而言,您的方法与工厂方法方法大致相同。

  

为什么我们需要使用setArguments添加额外的包?

你不需要它。它仅仅是用于为片段提供输入的可用和推荐模式。如果您愿意,欢迎您做其他事情。只记得拥有public零参数构造函数以及自定义构造函数,因为在重新创建片段时框架将使用public零参数构造函数。

答案 1 :(得分:0)

因为 savedInstance 每次都不会调用。当设备屏幕旋转或内部系统终止应用程序时,由于内存不足和更多场景,它将被触发。因此,如果要将某些值从活动传递到片段或片段到片段,则必须通过参数传递它。还有很多其他方式 - >你可以创建静态变量并将值存储在其中,但这不是传递值的完美值 - >它将消耗大量内存。所以通过论证是标准的方式

相关问题