第十三章 Preference

SharedPreference

App若想儲存一些簡單的資料, 不希望離開App後資料就消失. 而在下次再度開啟App時, 能把上次執行時的資料重現出來. 此時需使用SharedPreference處理

首先在activity_main.xml設定畫面如下

android_sharedpreference

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.asuscomm.mahaljsp.ch12_01_sharedpreference.MainActivity"
    android:orientation="vertical">

    <TextView
        android:text="帳號"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/editAccount"/>
    <TextView
        android:text="密碼"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView2"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/editPassword"/>
    <TextView
        android:text="電話"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView3"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/editTel"/>

    <Button
        android:onClick="btSave_click"
        android:text="儲存"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btSave" />

    <Button
        android:onClick="btClear_click"
        android:text="清除"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btClear" />

    <Button
        android:onClick="btRead_click"
        android:text="讀取"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btRead" />
</LinearLayout>

在程式碼中
1. 取得SharedPreference sp物件

常用的方法為PreferenceManager.getDefaultSharedPreferences(Context).
當資料需分群組時, 亦可使用Activity的getSharedPreference(String, MODE_PRIVATE)

2. sp.edit() 取得SharedPreference.Editor edtior物件. 此物件可用如下方法

putString(String, String);
putInt(String, int);
putBoolean(String, boolean);
putFloat(String, float);
putLong(String, long);
clear() : 清除資料
remove(String): 移除指定資料
commit() : 儲存資料
apply() : 同commit(), 但因為使用了cache, 效能比commit()更好

3. sp.getXXX(String, default) : 如getString, getInt, getFloat等, default是當取不到資料時的預設值

下列程式碼輸入完資料並按儲存後, 關閉App, 再重新打開, 會自動將上次的資料重新讀回

public class MainActivity extends AppCompatActivity {
    private static final String ACCOUNT="Account";
    private static final String PASSWORD="Password";
    private static final String TEL="Tel";
    Button btSave, btClear, btRead;
    EditText editAccount, editPassword, editTel;
    SharedPreferences sp;
    SharedPreferences.Editor editor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        processViews();
    }
    public void processViews(){
        editAccount=(EditText)findViewById(R.id.editAccount);
        editPassword=(EditText)findViewById(R.id.editPassword);
        editTel=(EditText)findViewById(R.id.editTel);
        sp= PreferenceManager.getDefaultSharedPreferences(this);
        editor=sp.edit();
        readData();
    }
    public void saveData(){
        editor.putString(ACCOUNT, editAccount.getText().toString());
        editor.putString(PASSWORD, editPassword.getText().toString());
        editor.putString(TEL, editTel.getText().toString());
        editor.apply();
    }
    public void clearData(){
        editor.clear();
        editor.apply();
        readData();
    }
    public void readData(){
        editAccount.setText(sp.getString(ACCOUNT, ""));
        editPassword.setText(sp.getString(PASSWORD, ""));
        editTel.setText(sp.getString(TEL, ""));
    }
    public void btRead_click(View view){
        readData();
    }
    public void btSave_click(View view){
        saveData();
    }
    public void btClear_click(View view){
        clearData();
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *