Android Studio切换Fragment后数据丢失问题求助
针对你切换Fragment后数据丢失的问题,给你两个适合新手的解决方案,都是Android里常用的状态保存/持久化方式:
方法一:用SharedPreferences持久化到本地(适合少量简单数据)
这是最容易上手的本地存储方式,能把数据存在设备里,重启APP也不会丢。
修改ThermometerFragment(保存数据)
在点击按钮的逻辑里,除了传递FragmentResult,把温度值存到SharedPreferences:
enter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int tempValue = Integer.parseInt(degrees.getText().toString()); // 1. 保存到SharedPreferences SharedPreferences sp = requireActivity().getSharedPreferences("GardenSettings", Context.MODE_PRIVATE); sp.edit().putInt("saved_temp", tempValue).apply(); // 2. 继续原有的FragmentResult传递 Bundle onOrOff = new Bundle(); onOrOff.putInt("df1", tempValue); getParentFragmentManager().setFragmentResult("dataFromThermometer", onOrOff); degrees.setText(""); } });
修改HomeFragment(读取初始数据)
在onCreateView里,先从SharedPreferences读取之前保存的值,初始化TextView的显示,再监听FragmentResult更新:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); TextView temp = view.findViewById(R.id.tvTemp); // 先读取保存的温度值,初始化UI SharedPreferences sp = requireActivity().getSharedPreferences("GardenSettings", Context.MODE_PRIVATE); int savedTemp = sp.getInt("saved_temp", 72); // 默认值设72 updateTempText(temp, savedTemp); // 原有的FragmentResult监听 getParentFragmentManager().setFragmentResultListener("dataFromThermometer", this, new FragmentResultListener() { @Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle onOrOff) { int temP = onOrOff.getInt("df1"); updateTempText(temp, temP); } }); return view; } // 把温度判断逻辑抽成方法,避免重复代码 private void updateTempText(TextView tempView, int tempValue) { if(tempValue < 72){ tempView.setText("Heat On!"); } else if(tempValue > 72) { // 用else if更严谨 tempView.setText("Cool Off"); } else { tempView.setText("Normal"); // 补充等于72的情况 } }
方法二:用ViewModel共享状态(适合进程内临时保存,不用写磁盘)
ViewModel会在Activity生命周期内保留数据,Fragment切换时只要Activity没销毁,数据就不会丢,适合不需要永久保存的场景。
第一步:创建共享的ViewModel
新建一个类,比如GardenViewModel:
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class GardenViewModel extends ViewModel { // 用LiveData自动通知UI更新 private MutableLiveData<Integer> tempValue = new MutableLiveData<>(72); // 默认72 public MutableLiveData<Integer> getTempValue() { return tempValue; } public void setTempValue(int value) { tempValue.setValue(value); } }
修改ThermometerFragment(更新ViewModel)
在点击事件里更新ViewModel的值:
// 获取ViewModel,用Activity的上下文确保共享 GardenViewModel viewModel = new ViewModelProvider(requireActivity()).get(GardenViewModel.class); enter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int tempValue = Integer.parseInt(degrees.getText().toString()); viewModel.setTempValue(tempValue); // 更新ViewModel degrees.setText(""); } });
修改HomeFragment(观察ViewModel数据)
在onCreateView里观察ViewModel的变化,自动更新UI:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); TextView temp = view.findViewById(R.id.tvTemp); // 获取共享的ViewModel GardenViewModel viewModel = new ViewModelProvider(requireActivity()).get(GardenViewModel.class); // 观察温度变化,自动更新UI viewModel.getTempValue().observe(getViewLifecycleOwner(), new Observer<Integer>() { @Override public void onChanged(Integer temP) { if(temP < 72){ temp.setText("Heat On!"); } else if(temP > 72) { temp.setText("Cool Off"); } else { temp.setText("Normal"); } } }); return view; }
两种方法的选择
- 如果需要重启APP后数据还保留,选SharedPreferences;
- 如果只需要APP运行期间切换Fragment不丢数据,选ViewModel更简单。
内容的提问来源于stack exchange,提问作者Isa
相关产品推荐
相关产品推荐

