1. 程式人生 > >Settings 新增一級選單

Settings 新增一級選單

Settings新增一級選單:

1、一級選單項的實現是Activity

     例如MySettings.java,此類檔案直接繼承的是Activity,新增比較簡單

(1)在清單檔案中新增如下內容    

<activity android:name="MySettings"
                android:label="@string/my_settings_title"
                android:icon="@drawable/my_settings_ic"
                android:taskAffinity="">
            <intent-filter android:priority="1">
                <action android:name="com.android.settings.MYSETTINGS" />
                <action android:name="android.settings.MYSETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
            <intent-filter android:priority="9">//在category中的物理位置(按優先順序排序時用到,並不是指第9個位置,數越大優先順序越大越靠前)
                <action android:name="com.android.settings.action.SETTINGS" />//指定此項在settings中顯示
            </intent-filter>
            <meta-data android:name="com.android.settings.ia.homepage"
                android:value="com.android.settings.category.device" />//指定此項顯示在主頁一級選單這一category中
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>

(2)自己實現MySettings這個Activity,其中是具體功能邏輯的實現

2、一級選單項的實現是fragment

(1)在清單檔案中新增如下內容 

<activity android:name=".Settings$MySettingsActivity"   //注意此處,MySettingsActivity是Settings的內部類,後面會解釋
                android:label="@string/my_settings_title"
                android:icon="@drawable/my_settings_ic"
                android:taskAffinity="">
            <intent-filter android:priority="1">
                <action android:name="com.android.settings.My_SETTING" />
                <action android:name="android.settings.My_SETTING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
            <intent-filter android:priority="9">
                <action android:name="com.android.settings.action.SETTINGS" />
            </intent-filter>
            <meta-data android:name="com.android.settings.category"
                android:value="com.android.settings.category.ia.homepage" />
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"//FRAGMENT_CLASS 表明value指定的類是fragment
                android:value="com.android.settings.MySettings" /> //MySettings實現類
            
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>

(2)自己實現MYSettings 這個fragment

(3)在Settings.java中新增

 public static class MySettingsActivity extends SettingsActivity { /* empty */ }

 MySettingsActivity 並不是一個Activity檔案,只是一個SettingsActivity的子類,且是空實現。之所以要加此空的Activity,是為了外部應用能直接跳轉到MySettingsActivity介面,因為如果只是fragment的話,外部是沒法跳轉到fragment介面的,跳轉到MySettingsActivity時,會執行其父類SettingsActivity.java中的方法,並根據MySettingsActivity在清單檔案中的註冊資訊, 它的meta-data的值,找到MySettingsActivity對應的fragment(MySettings),顯示出fragment介面,實現借殼。

如果<meta-data>中使用的是FRAGMENT_CLASS,一般都會宣告成Settings的內部類即

 <activity android:name="Settings$xxxActivity" > 的形式。   

注意此fragment是繼承與settings中通用的SettingsPreferenceFragment,並不是一般的fragment類