要避免丢失片段实例,可以采取以下解决方法:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "myFragment", myFragment);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
myFragment = getSupportFragmentManager().getFragment(savedInstanceState, "myFragment");
} else {
myFragment = new MyFragment();
}
// 添加或替换片段
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, myFragment)
.commit();
}
public class MyFragment extends Fragment {
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
// ...
}
public class MyViewModel extends ViewModel {
private MutableLiveData data = new MutableLiveData<>();
public void setData(String newData) {
data.setValue(newData);
}
public LiveData getData() {
return data;
}
}
public class MyFragment extends Fragment {
private MyViewModel viewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
viewModel.getData().observe(getViewLifecycleOwner(), new Observer() {
@Override
public void onChanged(String newData) {
// 更新界面
}
});
// ...
}
// ...
}
通过上述方法,可以有效地避免丢失片段实例。根据具体需求和场景,选择适合的解决方法即可。