我的问题很简单。我正在使用带有TabLayout(而不是Viewpager)的活动使用片段。我所有的片段都继承自具有以下功能的BaseFragment类:
public void pushFragmentAnimated(BaseFragment fragment) {
mActivity.pushFragmentAnimated(fragment);
}
在活动中,pushFragmentAnimated()
是:
public void pushFragmentAnimated(BaseFragment fragment) {
try {
mCurrentFragment = fragment;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
transaction.replace(R.id.fragment_container, fragment, fragment.TAG);
transaction.addToBackStack(fragment.getFragmentTitle());
transaction.commit();
manager.executePendingTransactions();
} catch (Exception e) {
e.printStackTrace();
}
}
问题是,使用此功能,我永远都无法保存片段状态,而当我弹出当前片段时,下面的片段会作为新片段重新加载。
实际上,在我的BaseFragment中,我有两个函数,通常在每个片段中都将其覆盖:
public void initializeFragment() {}
public void setupFragmentData() {}
这些函数在这里被调用:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = getView();
if (view == null && savedInstanceState == null) {
int layoutResource = getFragmentLayout();
view = inflater.inflate(layoutResource, container, false);
// ButterKnife bind
ButterKnife.bind(this, view);
// Initialization methods
initializeFragment();
}
return view;
}
在这里:
@Override
public void onResume() {
super.onResume();
// Initialization methods
setupFragmentData();
}
和第一个initializeFragment()
总是在我弹出片段时被调用,即使它不应该被调用。如您所见,只有第二个应该。
有什么主意吗?
答案 0 :(得分:0)
我建议您在片段中使用以下代码段:
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
// here you can save your variables value
}
并将您的任意字段保存在 outState 包中。
也如@Isosymmetric所说,您可以看看this的答案。
答案 1 :(得分:0)
那是因为您赚了replace
。如果可能-使用add
,它应该保存基础片段的状态。如果不可能,请使用解决方案@MilaDroid建议。
顺便说一句,是否有任何特定原因需要使用replace并将其添加到堆栈中?