如何解决Android - 保存片段状态简单的解决方案
我正在尝试使用 BottomNavigationView 保存片段状态。每次更改片段时,我都会使用此代码,如文档中所述
FragmentTransaction transaction = getParentFragmentManager().beginTransaction();
transaction.replace(R.id.nav_host_fragment,paceFragment);
transaction.addToBackStack(null);
transaction.commit();
但是每次我用新的 viewmodel 和新的状态获得“新鲜”片段时。我尝试过捆绑包、OnSaveInstanceState、将片段添加到后台堆栈,以及我可以在互联网上找到的更多解决方案。没有什么对我有用。
我想出了这样的解决方案:
FragmentStateManager 类作为单例
public class FragmentSaveStateManager {
private Map<String,viewmodel> savedStates;
private static FragmentSaveStateManager instance;
public static FragmentSaveStateManager getInstance(){
if(instance == null){
instance = new FragmentSaveStateManager();
}
return instance;
}
private FragmentSaveStateManager() {
savedStates = new HashMap<>();
}
public void saveFragmentState(String fragmentKey,viewmodel fragmentState){
savedStates.put(fragmentKey,fragmentState);
}
public viewmodel getFragmentState (String fragmentName){
if(savedStates.containsKey(fragmentName)){
return savedStates.get(fragmentName);
}
return null;
}
}
现在,在每个片段的 onDestroyView 上,我只需将其状态保存在管理器中...
@Override
public void onDestroyView() {
super.onDestroyView();
saveStateManager.saveFragmentState("home",homeviewmodel);
}
并在每个片段的 onCreateView 上恢复状态...
public View onCreateView(@NonNull LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
saveStateManager = FragmentSaveStateManager.getInstance();
viewmodel home = saveStateManager.getFragmentState("home");
View root = inflater.inflate(R.layout.fragment_home,container,false);
final EditText edit = root.findViewById(R.id.editTextTextPersonName);
if(home != null){
homeviewmodel = (Homeviewmodel) home;
edit.setText(homeviewmodel.getText().getValue());
}else{
homeviewmodel =
new viewmodelProvider(this).get(Homeviewmodel.class);
}
}
在我看来,此解决方案快速、清晰且简单。一切正常,旋转,片段滑动,后台应用程序,但是......我不确定这是否是正确的方法。也许在进一步的开发中,这个解决方案可能是某种“错误来源”。
这个解决方案是否可靠且正确?
当然,这只是一般的想法,需要一些严重的重构,如 BaseFragment、key 作为片段 id 等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。