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
相关产品推荐
相关产品推荐

