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

Android Studio中SharedPreference无法按条件读写值问题求助

问题排查与修复方案

我帮你梳理下代码里的几个关键问题,这就是导致SharedPreference读取异常和TextView不显示的原因:


1. 控件绑定错误导致TextView无法显示SharedPreference值

你看这段代码:

final TextView TextView2 = (TextView) findViewById(R.id.etid);
TextView2.setText(sid);

R.id.etid是你用来输入学生ID的EditText控件,不是TextView!你把TextView绑定到了EditText的ID上,这就导致setText根本没作用在正确的TextView上。你需要把这里的ID改成布局文件中对应TextView的真实ID,比如假设你的TextView ID是R.id.tv_saved_sid,那代码应该改成:

final TextView TextView2 = (TextView) findViewById(R.id.tv_saved_sid);
TextView2.setText(sid);

2. SharedPreference读取逻辑错误,且登录判断逻辑完全搞反了

问题点:

  • 你在onCreate里一次性读取了Logined和sid,但这些变量是静态缓存的,之后如果SharedPreference有更新(比如登录成功后修改了值),再次回到LoginActivity时这些变量不会自动刷新,应该在需要的时候实时读取,或者在onResume方法里重新加载。
  • 你的登录按钮判断逻辑完全写反了!当前代码是:
    • 如果Logined == true,才执行登录请求
    • 如果Logined == false,就弹出拦截提示
      这和你的需求完全相反——你的需求是:如果已经登录过(Logined == true),并且当前输入的ID和保存的sid不一致,才拦截;如果没登录过,或者输入的ID和保存的一致,才允许登录。

修复后的登录按钮逻辑:

btnlogin.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final String inputId = etid.getText().toString();
        final String inputPwd = etpwd.getText().toString();

        // 实时读取SharedPreference的最新值,而不是用onCreate的缓存
        boolean isLogined = sharedPref.getBoolean("Logined", false);
        String savedSid = sharedPref.getString("SID", "");

        if (!isLogined) {
            // 还没登录过,允许执行登录请求
            Response.Listener<String> responseListener = new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if (success) {
                            String id = jsonResponse.getString("id");
                            String pwd = jsonResponse.getString("pwd");
                            String name = jsonResponse.getString("name");

                            Intent intent = new Intent(LoginActivity.this, UserAreaActivity.class);
                            intent.putExtra("id", id);
                            intent.putExtra("pwd", pwd);
                            intent.putExtra("name", name);

                            // 登录成功后保存状态和ID
                            SharedPreferences.Editor prefEditor = sharedPref.edit();
                            prefEditor.putBoolean("Logined", true);
                            prefEditor.putString("SID", id);
                            prefEditor.apply();

                            LoginActivity.this.startActivity(intent);
                        } else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                            builder.setMessage("Login Failed")
                                    .setNegativeButton("Retry", null)
                                    .create()
                                    .show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            };
            LoginRequest loginRequest = new LoginRequest(inputId, inputPwd, responseListener);
            RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
            queue.add(loginRequest);
        } else {
            // 已经登录过,检查输入的ID和保存的是否一致
            if (inputId.equals(savedSid)) {
                // ID一致,允许登录(或者直接跳转到用户页面?)
                // 这里可以选择直接跳转到UserAreaActivity,或者重新执行登录请求,看你的需求
                Intent intent = new Intent(LoginActivity.this, UserAreaActivity.class);
                intent.putExtra("id", savedSid);
                // 可以从SharedPreference读取其他信息,或者重新请求
                LoginActivity.this.startActivity(intent);
            } else {
                // ID不一致,拦截并弹出提示
                AlertDialog.Builder helpfriend = new AlertDialog.Builder(LoginActivity.this);
                helpfriend.setMessage("The login ID not same with the previous ID.Trying to help friend sign? Please contact your lecturer.")
                        .setNegativeButton("Close", null)
                        .create()
                        .show();
            }
        }
    }
});

3. 补充:在onResume中重新加载SharedPreference值

为了保证每次回到LoginActivity时,TextView能显示最新的保存ID,你可以重写onResume方法:

@Override
protected void onResume() {
    super.onResume();
    // 重新读取SharedPreference的最新值
    String latestSid = sharedPref.getString("SID", "");
    TextView TextView2 = (TextView) findViewById(R.id.tv_saved_sid); // 记得用正确的TextView ID
    TextView2.setText(latestSid);
}

这样修改后,你的TextView就能正常显示保存的学生ID,SharedPreference的读取也会实时获取最新值,登录拦截逻辑也符合你的需求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:48:04