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

编程新手求助:Fragment中使用SharedPreferences保存TextView年龄数值的问题排查

解决你的SharedPreferences保存年龄问题

嘿,我看了你的代码,马上发现了几个关键问题导致年龄保存失败,咱们一步步来修复:

1. 最核心的问题:SharedPreferences实例未初始化

你只声明了SharedPreferences pref变量,但从来没有获取它的实例!点击保存按钮时,pref是null,直接会抛出空指针异常,根本执行不到保存逻辑。

修复方法:在onCreateView方法里,加载布局后就初始化SharedPreferences:

// 初始化SharedPreferences,"AgePrefs"是自定义的偏好文件名,可按需修改
pref = requireActivity().getSharedPreferences("AgePrefs", Context.MODE_PRIVATE);

2. 缺少读取已保存值的逻辑

你只实现了保存功能,但每次Fragment创建时,没有把之前保存的年龄读取出来显示到TextView上,导致看起来像没保存成功。

修复方法:初始化完TextView后,立即读取保存的值并设置:

TextView age = (TextView) v.findViewById(R.id.age);
// 读取保存的年龄,默认值设为"1"(和你的递减逻辑匹配)
String savedAge = pref.getString(save_key, "1");
age.setText(savedAge);

3. 潜在的异常风险

如果TextView的文本为空或者不是合法数字,Integer.parseInt会抛出NumberFormatException,导致APP崩溃。可以加个简单的校验优化:

比如在按钮点击事件里:

// 递增按钮里的校验优化
String ageText = age.getText().toString().trim();
if (!ageText.isEmpty()) {
    int currentAge = Integer.parseInt(ageText);
    if (currentAge > 0) {
        age.setText(String.valueOf(currentAge + 1));
    }
}

修改后的完整代码

public SharedPreferences pref;
public final String save_key = "save_key";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_third, container, false);
    
    // 1. 初始化SharedPreferences(新增)
    pref = requireActivity().getSharedPreferences("AgePrefs", Context.MODE_PRIVATE);
    
    TextView age = (TextView) v.findViewById(R.id.age);
    // 2. 读取已保存的年龄并设置(新增)
    String savedAge = pref.getString(save_key, "1");
    age.setText(savedAge);

    Button button_add_age = (Button) v.findViewById(R.id.button_add_age);
    button_add_age.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String ageText = age.getText().toString().trim();
            if (!ageText.isEmpty()) {
                int currentAge = Integer.parseInt(ageText);
                if (currentAge > 0) {
                    age.setText(String.valueOf(currentAge + 1));
                }
            }
        }
    });

    Button button_remove_age = (Button) v.findViewById(R.id.button_remove_age);
    button_remove_age.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String ageText = age.getText().toString().trim();
            if (!ageText.isEmpty()) {
                int currentAge = Integer.parseInt(ageText);
                if (currentAge > 1) {
                    age.setText(String.valueOf(currentAge - 1));
                }
            }
        }
    });

    Button saveButton = (Button) v.findViewById(R.id.save_button);
    saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 现在pref已经初始化,不会为空了
            SharedPreferences.Editor edit = pref.edit();
            edit.putString(save_key, age.getText().toString());
            edit.apply();
            // 可以加个Toast提示保存成功,提升用户体验
            Toast.makeText(requireContext(), "年龄已保存", Toast.LENGTH_SHORT).show();
        }
    });

    return v;
}

这样修改后,你的年龄保存和读取功能就能正常工作啦!

内容的提问来源于stack exchange,提问作者gojim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:37:31