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哈哈~。

项目源码下载

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