编程新手求助:Fragment中使用SharedPreferences保存TextView年龄数值的问题排查
嘿,我看了你的代码,马上发现了几个关键问题导致年龄保存失败,咱们一步步来修复:
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
相关产品推荐
相关产品推荐

