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