android 里的设置,可以用 官方提供的 Preference 来实现,可以参考网站 :http://developer.android.com/guide/topics/ui/settings.html
现在提供其中的一些简单用法,效果图如下:
在 res/ 目录下新建一个 xml 文件夹,并在其目录下新建文件 preferences.xml 。
如果有 10 个及以上的设置,可能会照成预览困难,建议通过将一些或所有的设置分为组来解决这个问题,有效地将一个长列表转换为多个较短的列表。
preferences.xml :
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="第一组" >
<!--android:entries 和 android:entryValues需要同时指定-->
<ListPreference
android:dialogTitle="dialog Title"
android:entries="@array/books"
android:entryValues="@array/books"
android:dialogIcon="@drawable/tianjia"
android:icon="@drawable/tianjia"
android:key="list_key"
android:summary="ListPreference 的简要说明"
android:title="ListPreference 的 title" />
</PreferenceCategory>
<PreferenceCategory android:title="第二组" >
<CheckBoxPreference
android:defaultValue="true"
android:key="checkbox_key"
android:icon="@drawable/tianjia"
android:summary="checkbox的简要说明"
android:title="checkbox title" />
<EditTextPreference
android:defaultValue="缺省值1"
android:key="edit_key_1"
android:icon="@drawable/tianjia"
android:summary="edit 的简要说明1"
android:title="edit text 1" />
</PreferenceCategory>
<Preference
android:icon="@drawable/tianjia"
android:summary="http://blog.csdn.net/antimage08"
android:title="浏览网页" >
<intent
android:action="android.intent.action.VIEW"
android:data="http://blog.csdn.net/antimage08" />
</Preference>
<!-- 此处将跳转到下一屏设置 -->
<PreferenceScreen
android:icon="@drawable/tianjia"
android:key="preference_screen_2_key"
android:persistent="false"
android:title="PreferenceScreen 2" >
<EditTextPreference
android:defaultValue="缺省值2"
android:icon="@drawable/tianjia"
android:key="edit_key_2"
android:summary="edit 简要说明2"
android:title="edit text 2" />
</PreferenceScreen>
<SwitchPreference
android:icon="@drawable/tianjia"
android:title="switch 的title"
android:summary="switch 的注释内容"
android:key="switch_key" />
</PreferenceScreen>
其中用到的 arrays.xml 数组资源(在 values 文件下新建)。
arrays.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="books" >
<item >大爆炸</item>
<item >时间简史</item>
<item >货币战争</item>
</string-array>
</resources>
MainActivity 需要继承 PreferenceActivity。
MainActivity .java :
package com.android.preferenceactivity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.widget.Toast;
public class MainActivity extends PreferenceActivity {
private EditTextPreference mEditTextPreference;
private ListPreference mListPreference;
private OnSharedPreferenceChangeListener changeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("edit_key_2")) {
mEditTextPreference = (EditTextPreference) findPreference("edit_key_2");
// 更新
String str1 = sharedPreferences.getString("edit_key_2", null);
mEditTextPreference.setSummary(str1);
}
if (key.equals("edit_key_1")) {
mEditTextPreference = (EditTextPreference) findPreference("edit_key_1");
String str2 = sharedPreferences.getString("edit_key_1", null);
mEditTextPreference.setSummary(str2);
}
if (key.equals("list_key")) {
mListPreference = (ListPreference) findPreference("list_key");
mListPreference.setSummary(mListPreference.getEntry());
}
Toast.makeText(MainActivity.this, key, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置读取的某个值的方法
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
// 添加设置的选项
addPreferencesFromResource(R.xml.preferences);
// 注册监听
sharedPreferences.registerOnSharedPreferenceChangeListener(changeListener);
}
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(changeListener);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(changeListener);
}
}
优化 :
Google 官方建议在Android 3.0 (API level 11) 及以上的时候使用 PreferenceFragment ,相比单独使用活动,无论我们构建什么样的 Activity,Fragment 都为我们的应用程序提供了更灵活的架构。所以在可能的情况下,用 PreferenceFragment 代替以前的PreferenceActivity
。
可以把前面的 MainActivity.java 中的代码拷贝到 PreferenceFragment 中(修改部分代码,如:onCreate(Bundle savedInstanceState) 方法的访问修饰符改为了 public,等),原来的 PreferenceActivity 修改为 Activity。
新建一个 SettingsFragment 类继承 PreferenceFragment 。
SettingsFragment .java :
package com.android.preferenceactivity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.widget.Toast;
public class SettingsFragment extends PreferenceFragment {
private EditTextPreference mEditTextPreference;
private ListPreference mListPreference;
private OnSharedPreferenceChangeListener changeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("edit_key_2")) {
mEditTextPreference = (EditTextPreference) findPreference("edit_key_2");
// 更新
String str1 = sharedPreferences.getString("edit_key_2", null);
mEditTextPreference.setSummary(str1);
}
if (key.equals("edit_key_1")) {
mEditTextPreference = (EditTextPreference) findPreference("edit_key_1");
String str2 = sharedPreferences.getString("edit_key_1", null);
mEditTextPreference.setSummary(str2);
}
if (key.equals("list_key")) {
mListPreference = (ListPreference) findPreference("list_key");
mListPreference.setSummary(mListPreference.getEntry());
}
Toast.makeText(getActivity(), key, Toast.LENGTH_SHORT).show();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置读取的某个值的方法
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
// 添加设置的选项
addPreferencesFromResource(R.xml.preferences);
// 注册监听
sharedPreferences.registerOnSharedPreferenceChangeListener(changeListener);
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(changeListener);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(changeListener);
}
}
MainActivity.java :
package com.android.preferenceactivity;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
运行优化后的效果,可以得到和以前一样的效果。