zoukankan      html  css  js  c++  java
  • Android-SharedPreferences

    在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>

    布局相关:

  • 相关阅读:
    oracle的wm_concat()方法与的排序问题,Oracle的 listagg 函数
    sql sever 常用的存储过程的写法或者说与Oracle中存过的异同点
    Oracle游标的使用
    oracle与sql sever的财务月份归属的问题
    sql sever使用习惯
    sqlsever 的存储过程的调试
    sql sever与Oracle的异同点
    单例模式
    线程 ---- 锁(生产者、消费者)
    IO 流理解实例
  • 原文地址:https://www.cnblogs.com/android-deli/p/10087055.html
Copyright © 2011-2022 走看看