引言
android平臺(tái)的手機(jī)上肯定會(huì)有如下圖所示的“設(shè)置”快捷方式(要么在桌面上痒谴,要么在屏幕下拉列表中),點(diǎn)擊進(jìn)入設(shè)置界面后可以進(jìn)行各種參數(shù)設(shè)置铡羡,如圖所示积蔚。
下面帶大家制作這個(gè)參數(shù)設(shè)置界面。
開發(fā)知識(shí)基礎(chǔ)
PreferenceActivity
PreferenceActivity間接繼承自Activity烦周,專門用于實(shí)現(xiàn)參數(shù)設(shè)置尽爆、存儲(chǔ)界面
PreferenceActivity和其他Activity的區(qū)別在于:
1.PreferenceActivity不使用普通的界面布局文件(以<LinearLayout>等標(biāo)簽開頭),而是使用專門的選項(xiàng)設(shè)置的布局文件读慎,示例如下:
普通界面布局文件:
<LinearLayout ......
<Button ....../>
......
</LinearLayout>
專門的選項(xiàng)設(shè)置的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:title="常規(guī)"
android:summary="常規(guī)設(shè)置"
android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1"/>
<header
android:title="聲音設(shè)置"
android:summary="聲音設(shè)置"
android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment2"/>
</preference-headers>
需要指出的是
普通的界面布局文件路徑為res/layout/XXX.xml漱贱,而參數(shù)設(shè)置布局文件路徑為res/xml/XXX.xml
2.PreferenceActivity加載界面布局文件的方式不同
普通activity加載布局文件方式如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main)//activity.xml為待加載界面布局文件
}
PreferenceActivity加載布局文件方式如下:
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.list_headers,target);
}//list_headers是待加載布局文件
Activity與Fragment
為了說明Activity和Fragment的關(guān)系,我們先來看張圖片
圖片左邊是不同新聞?lì)愋偷拿Q夭委,當(dāng)我們點(diǎn)擊其中一個(gè)后右邊會(huì)顯示該種類型的新聞幅狮。Activity是我們看到的整個(gè)界面,而左右兩邊分別兩個(gè)Fragment。
因此,其實(shí)Fragment是Activity的片段(fragment譯為“片段”),一個(gè)Activity可以包含多個(gè)Fragment
如何指定某一Activity包含哪些Fragment呢功茴?
方法一(動(dòng)態(tài)):在Activity的java文件中使用如下方法:
add(com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1)
//參數(shù)指定了要增加的Fragment的路徑及名稱唐责,
//其中com.golfer.www.parametersetting為包名
//PreferenceActivityTest.java中定義了多個(gè)Fragment,
//$表示增加其中名稱為Fragment1的那個(gè)Fragment)
remove()//參數(shù)省略
replace()//參數(shù)省略
方法二(靜態(tài)):在Activity的界面布局文件中
android:fragment="com.golfer.www.parametersetting.Pr
eferenceActivityTest$Fragment1"
對(duì)應(yīng)地,PreferenceActivity和PreferenceFragment往往配合使用
其中,PreferenceActivity的布局文件負(fù)責(zé)顯示選項(xiàng)設(shè)置列表,而PreferenceFragment的布局文件負(fù)責(zé)顯示具體的參數(shù)設(shè)置選項(xiàng)(即點(diǎn)擊選項(xiàng)設(shè)置列表其中一項(xiàng)后顯示的界面)
Fragment和Activity一樣(我們?cè)诶斫鈺r(shí)可以把Fragment理解為和Activity同地位)进每,有自己的布局文件和Java實(shí)現(xiàn)文件,下面詳細(xì)講解PreferenceFragment的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="聲音模式">
<ListPreference
android:title="音量"
android:summary="選擇低腐巢、中品追、高音量"
android:icon="@drawable/yinliang"
android:entries="@array/size_name"
android:dialogTitle="音量選擇"
android:entryValues="@array/size_value"/>
<CheckBoxPreference
android:title="靜音模式"
android:icon="@drawable/noyinliang"
android:summaryOn="開啟"
android:summaryOff="關(guān)閉"
android:defaultValue="false" />
</PreferenceCategory>
<PreferenceCategory android:title="鈴音和通知">
<RingtonePreference
android:title="來電鈴聲"
android:summary="選擇鈴聲"
android:icon="@drawable/call" >
</RingtonePreference>
</PreferenceCategory>
</PreferenceScreen>
其中,PreferenceCategory元素用于對(duì)參數(shù)選項(xiàng)進(jìn)行分組(即同一類型的參數(shù)設(shè)置歸為同一組冯丙,比如來電鈴聲設(shè)置肉瓦、短信鈴聲設(shè)置、其他通知鈴聲設(shè)置就可以分為一組)胃惜,用android:title指定參數(shù)組名泞莉,里面再包含具體的參數(shù)設(shè)置。
RingtonePreference元素:
點(diǎn)擊該元素后系統(tǒng)會(huì)調(diào)用手機(jī)原有的鈴聲設(shè)置模塊
CheckBoxPreference元素:
該元素旁邊有選擇框船殉,勾選后會(huì)在標(biāo)題下方顯示summaryOn對(duì)應(yīng)的字符鲫趁,沒有勾選則顯示summaryOff對(duì)應(yīng)的字符
ListPreference元素:
點(diǎn)擊該元素后,會(huì)彈出一個(gè)名稱為dialogTitle對(duì)應(yīng)的字符的列表對(duì)話框利虫,可在里面選擇其中一項(xiàng)挨厚,如示例的高音量、中音量糠惫、低音量
注:如何設(shè)置彈出的列表對(duì)話框顯示什么內(nèi)容呢疫剃?
步驟:
1.在res/values下添加arrays.xml
2.編輯arrays.xml,代碼示例如下:
<resources>
<string-array name="size_name">
<item>"低音量"</item>
<item>中音量</item>
<item>高音量</item>
</string-array>
<string-array name="size_value">
<item>"低音量"</item>
<item>中音量</item>
<item>高音量</item>
</string-array>
</resources>
3.在ListPreference中鍵入:
android:entries="@array/size_name"
android:entryValues="@array/size_value"
//注意不要寫成@arrays硼讽,否則會(huì)報(bào)錯(cuò)巢价,
類似地,字符串資源文件命名為strings.xml固阁,
但引用字符串時(shí)寫成@string/app_name
寫完布局文件后壤躲,如何在PreferenceFragment的java文件中加載對(duì)應(yīng)的布局文件呢?示例如下:
public static class Fragment1 extends PreferenceFragment {//指明繼承關(guān)系
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.XXX); //關(guān)鍵方法备燃,R.xml.XXX為待加載的布局 文件 }
}
實(shí)戰(zhàn)
有了上面的知識(shí)碉克,開始開發(fā)
PreferenceActivity(命名為PreferenceActivityTest)的界面布局文件(負(fù)責(zé)顯示選項(xiàng)設(shè)置列表)
list_headers.xml
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:title="常規(guī)"
android:summary="常規(guī)設(shè)置"
android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment1"/>
<header
android:title="聲音設(shè)置"
android:summary="聲音設(shè)置"
android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment2"/>
<header
android:title="顯示"
android:summary="顯示設(shè)置"
android:fragment="com.golfer.www.parametersetting.PreferenceActivityTest$Fragment3"/>
</preference-headers>
PreferenceActivity(命名為PreferenceActivityTest)的java文件(PreferenceFragment的java定義嵌入其中,作為內(nèi)部類)
PreferenceActivityTest.java
package com.golfer.www.parametersetting;
import android.app.Fragment;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import java.util.List;
public class PreferenceActivityTest extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);}
public void onBuildHeaders(List<Header> target)
{ loadHeadersFromResource(R.xml.list_headers,target); }
public boolean isValidFragment(String FragmentName)
{ return true; }
public static class Fragment1 extends PreferenceFragment {
public void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.regular); }
}
public static class Fragment2 extends PreferenceFragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.sound);}
}
public static class Fragment3 extends
PreferenceFragment{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.display); }
}
}
PreferenceFragment(以Fragment1的布局文件sound.xml為例)的布局文件(負(fù)責(zé)顯示具體的參數(shù)設(shè)置選項(xiàng))
sound.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="聲音模式">
<ListPreference
android:title="音量"
android:summary="選擇低并齐、中漏麦、高音量"
android:icon="@drawable/yinliang"
android:entries="@array/size"
android:dialogTitle="音量選擇"
android:entryValues="@array/Size"/>
<CheckBoxPreference
android:title="靜音模式"
android:icon="@drawable/noyinliang"
android:summaryOn="開啟"
android:summaryOff="關(guān)閉"
android:defaultValue="false" />
</PreferenceCategory>
<PreferenceCategory android:title="鈴音和通知">
<RingtonePreference
android:title="來電鈴聲"
android:summary="選擇鈴聲"
android:icon="@drawable/call" >
</RingtonePreference>
<RingtonePreference
android:title="信息鈴聲"
android:summary="選擇鈴聲"
android:icon="@drawable/text" >
</RingtonePreference>
<RingtonePreference
android:title="其他通知鈴聲"
android:summary="選擇鈴聲"
android:icon="@drawable/inform" >
</RingtonePreference>
<CheckBoxPreference
android:title="響鈴時(shí)振動(dòng)"
android:icon="@drawable/zhendong"
android:summaryOff="關(guān)閉"
android:summaryOn="開啟"
android:defaultValue="true">
</CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
成果演示: