You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:25:55