在Android开发过程中,数据都保存,有种方式就是通过 SharedPreferences,共享首选项
共享首选项SharedPreferences,的作用是可以以键值对应的方式保存数据读取数据,什么时候使用SharedPreferences,当APP需要保存配置信息当时候就可以使用SharedPreferences
例如:Settings APP应用里面的很多配置信息就是使用共享首选项来保存的,例如:登录时候的记住用户名,记住密码操作就是使用共享首选项来保存的
Checkbox控件,RadioButtonk控件,等等都是通过共享首选项来保存的,只要是保存APP应用里面的配置信息,就是用共享首选项来保存的
可以以下这种方式创建 共享首选项
/** * 这种方式是Android提供的,只需传入模式,SP的名称就是当前的类名 * @param mode 传入Mode * @return */ @Override public SharedPreferences getPreferences(int mode) { return super.getPreferences(mode); } /** * 这种方式是Android提供的,只需传入模式,SP的名称就是当前的类名 * @param name 传入SP的名称 * @param mode 传入Mode * @return */
创建共享首选项介绍:
// 取名为 login_config 模式为:私有模式,每次保存覆盖之前保存的信息 sp = getSharedPreferences("login_config", Context.MODE_PRIVATE);
保存数据,需要使用到 edit,记得commit():
sp.edit().putString("et_name", etName.getText().toString()) .putBoolean("cb_remember_name", true).commit();
只有commit(); 后才会出现:
读取共享首选项数据:
sp.getBoolean("cb_remember_name", false);
注意:??注意:?? 要加上这个判断 if (buttonView.isPressed()) ,否则设置 setChecked就会激发这个监听,从而引发问题
package liudeli.datastorage; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; public class MainActivity2 extends Activity { private final String TAG = MainActivity2.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); initListener(); } private EditText etName; private EditText etPwd; private CheckBox cbRememberName; private CheckBox cbRememberNamePwd; private Button btLogin; private SharedPreferences sp; /** * 这种方式是Android提供的,只需传入模式,SP的名称就是当前的类名 * @param mode 传入Mode * @return */ @Override public SharedPreferences getPreferences(int mode) { return super.getPreferences(mode); } /** * 这种方式是Android提供的,只需传入模式,SP的名称就是当前的类名 * @param name 传入SP的名称 * @param mode 传入Mode * @return */ @Override public SharedPreferences getSharedPreferences(String name, int mode) { return super.getSharedPreferences(name, mode); } private void initView() { etName = findViewById(R.id.et_name); etPwd = findViewById(R.id.et_pwd); cbRememberName = findViewById(R.id.cb_remember_name); cbRememberNamePwd = findViewById(R.id.cb_remember_name_pwd); btLogin = findViewById(R.id.bt_login); // 取名为 login_config 模式为:私有模式,每次保存覆盖之前保存的信息 sp = getSharedPreferences("login_config", Context.MODE_PRIVATE); } private void initListener() { btLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); cbRememberName.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 注意:?? 要加上这个判断,否则设置 setChecked就会激发这个监听,从而引发问题 if (buttonView.isPressed()) { boolean checkName = checkName(); if (cbRememberName.isChecked() && checkName) { // 保存用户名 sp.edit().putString("et_name", etName.getText().toString()) .putBoolean("cb_remember_name", true).commit(); cbRememberName.setChecked(true); } else { sp.edit().putBoolean("cb_remember_name", false).commit(); cbRememberName.setChecked(false); } } } }); cbRememberNamePwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 注意:?? 要加上这个判断,否则设置 setChecked就会激发这个监听,从而引发问题 if(buttonView.isPressed()) { boolean checkNamePwd = checkNamePwd(); if (cbRememberNamePwd.isChecked() && checkNamePwd) { // 保存用户名和密码 sp.edit().putString("et_name", etName.getText().toString()) .putString("et_pwd", etPwd.getText().toString()) .putBoolean("cb_remember_name_pwd", true) .putBoolean("cb_remember_name", true).commit(); cbRememberNamePwd.setChecked(true); cbRememberName.setChecked(true); } else { sp.edit().putBoolean("cb_remember_name_pwd", false).commit(); cbRememberNamePwd.setChecked(false); } } } }); } private boolean checkName() { return !TextUtils.isEmpty(etName.getText().toString()); } private boolean checkNamePwd() { return !TextUtils.isEmpty(etName.getText().toString()) && !TextUtils.isEmpty(etPwd.getText().toString()); } @Override protected void onResume() { super.onResume(); // 判断是否记住了用户名,如果保存了 或者 没有保存 都更新Checkbox,默认第一次是false boolean rememberName = sp.getBoolean("cb_remember_name", false); Log.d(TAG, "rememberName:" + rememberName); cbRememberName.setChecked(rememberName); Log.d(TAG, "cbRememberName.isChecked():" + cbRememberName.isChecked()); if (cbRememberName.isChecked()) { // 获取用户名保存到EditText etName.setText(sp.getString("et_name", null)); } else { // 如果记住用户名是false就没有必要往下走了 return; } // 判断是否记住了用户名和密码,如果保存了 或者 没有保存 都更新Checkbox,默认第一次是false boolean rememberNamePwd = sp.getBoolean("cb_remember_name_pwd", false); cbRememberNamePwd.setChecked(rememberNamePwd); if (cbRememberNamePwd.isChecked()) { // 获取用户名保存到EditText etName.setText(sp.getString("et_name", null)); etPwd.setText(sp.getString("et_pwd", null)); } } @Override protected void onDestroy() { super.onDestroy(); } }
布局相关代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户" /> <EditText android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="6dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码" /> <EditText android:id="@+id/et_pwd" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="6dp" android:inputType="textPassword" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <CheckBox android:id="@+id/cb_remember_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住用户名"/> <CheckBox android:id="@+id/cb_remember_name_pwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住用户名和密码" android:layout_alignParentRight="true" /> </RelativeLayout> <Button android:id="@+id/bt_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" /> </LinearLayout>
布局相关: