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

Android中Register页存储SharedPreferences至其他类读取报错求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:18