Android中Register页存储SharedPreferences至其他类读取报错求助
看起来你在实现注册页面存储用户名到SharedPreferences,再在其他类读取并设置到TextView的过程中遇到了问题。结合你给出的代码片段,我帮你梳理几个最可能的错误点,以及对应的解决办法:
1. 常量的访问权限问题
你在读取时用到了RegisterClass.PREFS,如果PREFS和DISPLAY_NAME_KEY这两个常量在RegisterClass里没有定义为public static,其他类根本无法访问它们,会直接触发编译错误或者运行时异常。
修复方法:
在RegisterClass里把这两个常量改成全局可访问的静态常量:
// 在RegisterClass的类级别定义 public static final String PREFS = "UserPrefs"; // 替换成你实际用的偏好文件名 public static final String DISPLAY_NAME_KEY = "saved_user_name"; // 替换成你实际用的键名
2. getString方法参数不完整
你写的prefs.getS...明显没写完,getString()方法需要两个参数:键名和默认值。如果省略默认值,当SharedPreferences里没有对应键的数据时,会返回null,后续直接把null设置给TextView就会触发NullPointerException。
修复方法:
补全getString()的参数,传入合理的默认值(比如空字符串):
private void setUserName(){ String mSetUserName; SharedPreferences prefs = getSharedPreferences(RegisterClass.PREFS, MODE_PRIVATE); // 补全方法,传入默认值 mSetUserName = prefs.getString(RegisterClass.DISPLAY_NAME_KEY, ""); // 这里确保TextView已经初始化,再设置文本 yourUserNameTextView.setText(mSetUserName); }
3. 确保存储方法被正确调用
很多时候报错是因为根本没执行存储逻辑!你需要确认在注册流程中(比如用户点击注册按钮时),确实调用了saveUserName()方法。
示例:
在RegisterClass的注册按钮点击事件里调用存储方法:
// 假设注册按钮的ID是btn_register Button registerBtn = findViewById(R.id.btn_register); registerBtn.setOnClickListener(v -> { // 先验证用户名输入是否合法(可选) if (!TextUtils.isEmpty(mUsernameView.getText().toString())) { saveUserName(); // 调用存储方法 // 跳转到需要读取用户名的页面 startActivity(new Intent(RegisterClass.this, TargetActivity.class)); } });
4. TextView未初始化导致的空指针
如果你的TextView还没通过findViewById或者ViewBinding完成初始化,就调用setText(),会直接触发NullPointerException。
修复方法:
确保在调用setUserName()之前,TextView已经完成初始化:
private TextView yourUserNameTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.target_activity_layout); // 初始化TextView yourUserNameTextView = findViewById(R.id.tv_user_name); // 再调用读取方法 setUserName(); }
完整可行的示例代码
RegisterClass(存储侧)
public class RegisterClass extends AppCompatActivity { public static final String PREFS = "UserPrefs"; public static final String DISPLAY_NAME_KEY = "saved_user_name"; private EditText mUsernameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register_layout); mUsernameView = findViewById(R.id.et_username); Button registerBtn = findViewById(R.id.btn_register); registerBtn.setOnClickListener(v -> { saveUserName(); startActivity(new Intent(this, ProfileActivity.class)); }); } private void saveUserName(){ String userName = mUsernameView.getText().toString(); SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE); prefs.edit().putString(DISPLAY_NAME_KEY, userName).apply(); } }
ProfileActivity(读取侧)
public class ProfileActivity extends AppCompatActivity { private TextView userNameTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.profile_layout); userNameTextView = findViewById(R.id.tv_user_name); setUserName(); } private void setUserName(){ SharedPreferences prefs = getSharedPreferences(RegisterClass.PREFS, MODE_PRIVATE); String mSetUserName = prefs.getString(RegisterClass.DISPLAY_NAME_KEY, "匿名用户"); userNameTextView.setText(mSetUserName); } }
如果按照上面的步骤调整后还是报错,可以把Logcat里的具体错误信息贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Victor Onyebuchi

