Android偏好設置SharedPreference你不知道的祕密

對於Android的初學者來說,sharedpreference還是比較迷茫的,也許有些人只知道它能幫助我們保存一些自己應用偏好設置,但卻不知道它是可以界面話的展示給我們的,並且還能在界面上修改這些設置,看完這篇文章,你會覺得,再Android中其實有很多我們不知道的好東西。

項目源碼下載

好了,廢話少說,進入正題

1、先看效果:

這裏寫圖片描述


這裏寫圖片描述


這裏寫圖片描述


這裏寫圖片描述


分析:看第一張圖,有人可能會覺得這不就是一個簡單的界面嗎,我用checkBox和開關控件switch等一些簡單的控件就能實現,沒什麼難的。如果是這樣,我們在想想,是不是邏輯上,你要獲取這些控件的值,然後在java代碼中寫一堆耗時費力的代碼嗎?不錯,那我接下來講的東西,如果你看了,你會覺得,恩,省了不少力氣。

2、上代碼:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference
        android:icon="@drawable/ic_launcher"
        android:key="mPreference"
        android:summary="Preference_summary"
        android:title="Preference_title" />

    <CheckBoxPreference
        android:key="mCheckBoxPreference"
        android:summary="CheckBoxPreference_summary"
        android:summaryOff="未選中"
        android:summaryOn="已經選中"
        android:title="CheckBoxPreference_title" />

    <SwitchPreference
        android:key="mSwitchPreference"
        android:summary="SwitchPreference_summary"
        android:title="SwitchPreference_title" 
        android:switchTextOff="已關" 
        android:summaryOn="開關已打開" 
        android:summaryOff="開關已關閉" 
        android:switchTextOn="已開"/>

    <ListPreference
        android:dialogIcon="@drawable/ic_launcher"
        android:dialogTitle="這是list dialog title"
        android:entries="@array/entry_list"
        android:entryValues="@array/value_list"
        android:key="mListPreference"
        android:negativeButtonText="@android:string/no"
        android:positiveButtonText="@android:string/ok"
        android:title="更多操作" />

    <EditTextPreference
        android:dialogIcon="@drawable/ic_launcher"
        android:dialogTitle="這是dialog_title"
        android:enabled="true"
        android:negativeButtonText="@android:string/no"
        android:positiveButtonText="@android:string/ok"
        android:summary="可編輯preference_summary"
        android:title="可編輯preference_title" 
        android:key="mEditTextPreference"/>

</PreferenceScreen>

乍一看,怎麼會是PreferenceScreen,這是什麼東東,沒見過?
好,我先講一下,這個東西在Android 系統一出來的時候就自帶的,只是我們不知道而已,那它是怎麼生成的呢?別急,看圖:

xml
在res目錄下新建一個xml的文件夾,然後新建xml文件:

preference

我們通常是選layout,但是這裏,我們選的是preference,然後選中之後:

這裏寫圖片描述

點擊finish就可以了。之後就是我們看到的代碼根佈局PreferenceScreen了。
那有人就說了,我怎麼知道該向裏邊添加什麼子控件呢,不着急,看圖:

這裏寫圖片描述

每個佈局文件下面都會有Strcture等等這些標籤,我們打開之後,看:

這裏寫圖片描述

好了,這裏子控件,我就不一個個的添加了,我已經添加好了5個常用的,接下來看這個佈局對應的Activity了。

MyPreferenceActivity.java:

public class MyPreferenceActivity extends PreferenceActivity implements
        OnPreferenceClickListener {

    private static final String TAG = "====MyPreferenceActivity====";
    private Preference mPreference;
    private ListPreference mListPreference;
    private CheckBoxPreference mCheckBoxPreference;
    private SwitchPreference mSwitchPreference;
    private EditTextPreference mEditTextPreference;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.custom_preference);
        mPreference = findPreference("mPreference");
        mListPreference = (ListPreference) findPreference("mListPreference");
        mCheckBoxPreference = (CheckBoxPreference) findPreference("mCheckBoxPreference");
        mSwitchPreference = (SwitchPreference) findPreference("mSwitchPreference");
        mEditTextPreference = (EditTextPreference) findPreference("mEditTextPreference");

        setOnclickListener();

    }

    private void setOnclickListener() {
        mPreference.setOnPreferenceClickListener(this);
        mListPreference.setOnPreferenceClickListener(this);
        mCheckBoxPreference.setOnPreferenceClickListener(this);
        mSwitchPreference.setOnPreferenceClickListener(this);
        mEditTextPreference.setOnPreferenceClickListener(this);
    }

    @Override
    @Deprecated
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
        // TODO Auto-generated method stub
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        // TODO Auto-generated method stub
        String key = preference.getKey();
        switch (key) {
        case "mPreference":
            showMsg("====mPreference====");
            break;
        case "mListPreference":
            showMsg("====mListPreference====");

            break;
        case "mCheckBoxPreference":
            showMsg("====mCheckBoxPreference====");

            break;
        case "mSwitchPreference":
            showMsg("====mSwitchPreference====");

            break;
        case "mEditTextPreference":
            showMsg("====mEditTextPreference====");

            break;

        default:
            break;
        }
        return true;
    }

    private void showMsg(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
        Log.e(TAG, str);
    }

}

我們發現在一般的activity裏邊是findViewById(),而在這裏繼承自PreferenceActivity之後是findPreference(),連onClick()方法都變成了onPreferenceClick(),其實原理都是一樣的。

好了,接下來看主界面代碼MainActivity.java:

public class MainActivity extends Activity {

    private static final String TAG = "====MainActivity====";
    private Button mButton;
    private TextView mtv1;
    private TextView mtv2;
    private TextView mtv3;
    private TextView mtv4;
    private TextView mtv5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) this.findViewById(R.id.mButton);
        mtv1 = (TextView) this.findViewById(R.id.mtv1);
        mtv2 = (TextView) this.findViewById(R.id.mtv2);
        mtv3 = (TextView) this.findViewById(R.id.mtv3);
        mtv4 = (TextView) this.findViewById(R.id.mtv4);
        mtv5 = (TextView) this.findViewById(R.id.mtv5);

        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this,
                        MyPreferenceActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
        // showMsg("選中框checkBox:  "
        // + prefs.getBoolean("mCheckBoxPreference", false));
        // showMsg("開關:  " + prefs.getBoolean("mSwitchPreference", false));
        // showMsg("mEditTextPreference:  "
        // + prefs.getString("mEditTextPreference", "mEditTextPreference"));
        // showMsg("mPreference:  "
        // + prefs.getString("mPreference", "mPreference"));
        // showMsg("mListPreference:  "
        // + prefs.getString("mListPreference", "mListPreference"));
        mtv1.setText("選中框checkBox:  "
                + prefs.getBoolean("mCheckBoxPreference", false));
        mtv2.setText("開關:  " + prefs.getBoolean("mSwitchPreference", false));
        mtv3.setText("mEditTextPreference:  "
                + prefs.getString("mEditTextPreference", "mEditTextPreference"));
        mtv4.setText("mPreference:  "
                + prefs.getString("mPreference", "mPreference"));
        mtv5.setText("mListPreference:  "
                + prefs.getString("mListPreference", "mListPreference"));
    }

    private void showMsg(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
        Log.e(TAG, str);
    }

}

對應佈局文件main:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.test_sharedpreference.MainActivity" >

    <TextView
        android:id="@+id/mtv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview  1" />
    <TextView
        android:id="@+id/mtv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview  2" />
    <TextView
        android:id="@+id/mtv3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview  3" />
    <TextView
        android:id="@+id/mtv4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview  4" />
    <TextView
        android:id="@+id/mtv5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textview  5" />

    <Button
        android:id="@+id/mButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳轉PreferenceActivity" />

</LinearLayout>

最後不要忘了再AndroidManifast文件裏邊添加Activity聲明哦:

這裏寫圖片描述

代碼運行一下,就是上面的圖片效果,是不是對Android有點興趣了,呵呵~

好了,第一篇關於SharedPreference的內容講到這裏就差不多了,我們也對它有了新的認識,以後對於自己應用程序的設置頁面裏,像酷狗裏邊的wifi設置、線控切歌等等,都可以用它來簡單的實現了,歐耶O(∩_∩)O哈哈~。

項目源碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章