在Day18的時候我介紹了Intent頁面跳轉,並且結合了登入畫面按下登入後會去比對帳號跟密碼,接著當帳密是正確的時候就進行跳轉頁面的動作,當時我使用的是一種非常簡陋的方法存取帳密,且當時我也提到更正確的方法應該要使用Room或SharedPreference這種資料庫來存取會更好,因此今天就來好好講解一下SharedPreference的使用方法,會使用Day18做的實作進行修改。
這次以Day18為基底增加了CheckBox這個物件,這個物件就相當於在登入介面中常見的「是否記住帳號資訊
」,或是註冊介面會看到的「我不是機器人
」,我可以將CheckBox跟Button做結合,在按下我不是機器人之前,按鈕不管怎麼按都沒辦法觸發
在上面搜尋checkbox或者在Buttons分類中找到
這次實作新增了一個ChcekBox
SharedPreference有分兩種使用方式:
getSharedPreferences
getPreferences
getSharedPreferences,在設定時需要指定一個文件名稱用來存取資料,就相當於Key的功用,也因此使用getSharedPreferenece使用SharedPreference時可以寫在class裡面,用方法將資料存取、取出,透過這種方式就可以讓不同的Activity調用從其他Activity存取的資料,也是本次實作會使用的方法。
getPreference,使用這個方法時可以不用指定文件名稱,直接使用getActivity指定存取的地方,但也因為這個特性所以會讓其他Activity無法調用資料,因此這個方法通常只會用在Activity中存取及調用資料。
存取資料的方式兩種方法都是相同的,下面就介紹怎麼使用第一個方法
首先建立一個class取名為MySharedPreference
宣告SharedPreference以及SharedPreference的Editor,再建立一個建構元
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
private String act = "account";
private String pwd = "password";
public MySharedPreference(Context context){
sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.app_name),Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
}
這裡設定初始化SharedPreference時要傳入那個Activity的Context,接著要綁定SharedPreference,前面的參數要填入文件名稱(Key)context.getResources().getString(R.string.app_name)
讀取的是專案的名稱,如果沒有要做特別的分類使用專案名稱就可以了
接著後面的Context.MODE_PRIVATE
設定這個SharedPreference的模式為只能讓現在這個App進行存取及讀取的動作,原本還有另外兩個模式可使用,但在API版本17開始將另外兩個模式廢棄了,這邊就不多做介紹詳細可以參考這個文章使用 SharedPreferences 保存简单数据
最後editor,就是SharedPreference的編輯器,在存取資料時需要使用到這個
public void setAccount(String account){ editor.putString(act,account).commit(); }
public void setPassword(String password){ editor.putString(pwd,password).commit(); }
存取資料時要使用editor裡面的put方法
依據資料的型態用不同方法存取,這次實作只會用到String所以這邊就選擇使用putString()
接著要傳入Key跟Value,Key就自己隨意設定,Value的部分可以設定調用這個方法時需要傳入String,再將傳入的String當成Value傳入即可
最後最重要的是要commit
,commit過後才會將資料更新。
補充 : 除了commit還可以選擇使用apply,兩個的差別在於前者會同步進行資料的修改,但是有機會影響到主線程,後者則是非同步更改資料。
public String getAccount(){ return sharedPreferences.getString(act,""); }
public String getPassword(){ return sharedPreferences.getString(pwd,""); }
讀取資料的方法如上,因應不同資料的型態就要get不同的形態,這邊因為存取的都是String所以這裡就使用getString來抓取資料,參數則要往裡面傳入Key跟如果沒有抓到資料的話要回傳的內容,所以這裡就是沒抓到資料就傳一個空值回去。
以上就完成了SharedPreference的設定啦~可喜可賀‧★,::‧( ̄▽ ̄)/‧:‧°★*
這次就針對有做修改的地方講解
private CheckBox checkBox;
private MySharedPreference mySharedPreference;
mySharedPreference = new MySharedPreference(this);
private void checkActPwdData(String act, String pwd) {
String account = mySharedPreference.getAccount();
String password = mySharedPreference.getPassword();
if (act.equals(account) && pwd.equals(password)){
Intent intent = new Intent();
intent.setClass(this, MainActivity.class);
startActivity(intent);
}
else{
Toast.makeText(this,"帳號或密碼有誤",Toast.LENGTH_SHORT).show();
et_account.setText("");
et_password.setText("");
}
}
這裡改成向SharedPreference要取帳號跟密碼的資料,然後去比對是否相同,是就跳轉到主頁面否就清除輸入並且用Toast提醒。
checkBox = dialog.findViewById(R.id.checkBox);
因為CheckBox是在Dialog上,所以綁定id的部分也要寫在這裡
create.setEnabled(false);
checkBox.setChecked(false);
這邊設計成在CheckBox被勾選前Button為無法點擊的狀態,並且將CheckBox設定為未被勾選的狀態,避免註冊完帳號又再按一次註冊時CheckBox會因為沒有重製而顯示勾選狀態
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (checkBox.isChecked()) create.setEnabled(true);
else create.setEnabled(false);
}
});
CheckBox通常都會使用setOnCheckedChangeListener來偵測勾選的狀態,這裡設定當CheckBox為勾選狀態時,就讓create按鈕變回可點選狀態,反之就變回不可點選狀態
create.setOnClickListener(view -> {
if (register_act.getText().toString().isEmpty() || register_pwd.getText().toString().isEmpty()){
Toast.makeText(this,"帳號或密碼不能為空",Toast.LENGTH_SHORT).show();
}
else{
mySharedPreference.setAccount(register_act.getText().toString());
mySharedPreference.setPassword(register_pwd.getText().toString());
register_act.setText("");
register_pwd.setText("");
dialog.dismiss();
}
});
最後create的部分,這裡額外設計了檢測帳密不得為空,避免有什麼奇怪的事發生
如果有輸入就呼叫SharedPreference的設定帳號跟密碼的方法,並且傳入相關的資料。