我一直在使用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;
}
}
答案 0 :(得分:1)
为什么saveInstanceState束不够用?
这就够了。参数Bundle
会自动添加到已保存的实例状态Bundle
。
我做了一个简单的测试,似乎与稍微重一点的当前练习一样好。
就代码行而言,您的方法与工厂方法方法大致相同。
为什么我们需要使用setArguments添加额外的包?
你不需要它。它仅仅是用于为片段提供输入的可用和推荐模式。如果您愿意,欢迎您做其他事情。只记得拥有public
零参数构造函数以及自定义构造函数,因为在重新创建片段时框架将使用public
零参数构造函数。
答案 1 :(得分:0)
因为 savedInstance 每次都不会调用。当设备屏幕旋转或内部系统终止应用程序时,由于内存不足和更多场景,它将被触发。因此,如果要将某些值从活动传递到片段或片段到片段,则必须通过参数传递它。还有很多其他方式 - >你可以创建静态变量并将值存储在其中,但这不是传递值的完美值 - >它将消耗大量内存。所以通过论证是标准的方式