對於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 系統一出來的時候就自帶的,只是我們不知道而已,那它是怎麼生成的呢?別急,看圖:
在res目錄下新建一個xml的文件夾,然後新建xml文件:
我們通常是選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哈哈~。