在Android的应用中通常都有setting功能,能够设置一些全局的选项,例如字体颜色,个人喜好等等。这些东西都存在一个xml中,在android中对应的对象就是SharedPreferences。在android3.0之前,我们一般继承PreferenceActivity这个基类去实现相关的方法。在3.0之后的系统中当然选择使用PreferenceFragment了,原因是PreferenceFragment是一个更加平滑的结构,你可以将它依附在任何的activity上面,这也是谷歌强力推荐的。
常用Preference
CheckPreference —— CheckBox 单选框
EditTextPreference —— EditText 输入文本框
ListPreference —— ListView 列表框
RingtonePreference —— 选择铃声
XML定义常用的属性有:
android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。
android:defaultValue : 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;
EditTextPreference的默认值可为”110” 。
android:enabled : 表示该Preference是否可用状态。
android:title : 每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary : 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)
ListPreference中:
android:entries:类型为array,控件欲显示的文本
android:entryValues:类型为array,与文本相对应的key-value键值对,value保存至sharedPreference文件
说完了,就开始介绍如何使用吧,
1、在项目的res/xml中新建一个preferences.xml。用于定义菜单界面的设置选项
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="inline_preferences" >
<CheckBoxPreference
android:key="checkbox_preference"
android:summary="这是一个复选框"
android:title="复选框" />
</PreferenceCategory>
<PreferenceCategory android:title="dialog-based preferences" >
<EditTextPreference
android:dialogTitle="编辑文本对话框"
android:key="edittext_preference"
android:summary="这是一个编辑文本对话框"
android:title="可编辑文本框" />
<ListPreference
android:dialogTitle="请选择一项"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:key="list_preferenc"
android:summary="这是一个列表对话框"
android:title="列表对话框" />
</PreferenceCategory>
<PreferenceCategory android:title="Launch preferences" >
<!-- This PreferenceScreen tag serves as a screen break (similar to page break in word processing). Like for other preference types, we assign a key here so it is able to save and restore its instance state. -->
<PreferenceScreen
android:key="screen_preference"
android:summary="展示另一个首选项配置页面"
android:title="页面首选项" >
<!-- 你可以在这里放置更多的首选项内容,将被在下一个页面呈现出来 -->
<CheckBoxPreference
android:key="next_screen_checkbox_preference"
android:summary="在另一个页面展示但出于同一个层级的首选项配置"
android:title="复选框设置" />
</PreferenceScreen>
<PreferenceScreen
android:summary="从一个意图中启动一个activity"
android:title="意图首选项" >
<intent
android:action="android.intent.action.VIEW"
android:data="http://www.baidu.com" />
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="Preference attributes" >
<CheckBoxPreference
android:key="parent_checkbox_preference"
android:summary="这是一个可见的父类"
android:title="父类复选框首选项" />
<!-- 子类的可见类型是由样式属性定义的 -->
<CheckBoxPreference
android:dependency="parent_checkbox_preference"
android:key="child_checkbox_preference"
android:layout="?android:attr/preferenceLayoutChild"
android:summary="这是一个可见的子类"
android:title="子类复选框首选项" />
</PreferenceCategory>
</PreferenceScreen>
2、创建MyPerferenceFragment.java
public class MyPerferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
3、修改MainActivity.java类
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_settings) {
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
MyPerferenceFragment fragment = new MyPerferenceFragment();
transaction.replace(R.id.lin, fragment);
transaction.commit();
}
return super.onOptionsItemSelected(item);
}
}
参考:
http://www.linuxidc.com/Linux/2013-09/90299.htm
标签:xml,Fragment,子类,MyPerferenceFragment,Preference,android,public,PreferenceFragmen From: https://blog.51cto.com/u_6947107/7548529