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类

猜你喜欢

转载自blog.csdn.net/qq_34149526/article/details/83444292