Fragment初學5——使用Fragment的子類PreferenceFragment

爆米花9958發表於2016-01-05

在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://blog.csdn.net/eyu8874521/article/details/8250611

http://www.linuxidc.com/Linux/2013-09/90299.htm


相關文章