我的私人博客:www.mrloveqin.top 可以查看更多内容
21. Settings内置选项在一级菜单fragment方式
① 在AndroidManifest.xml 添加如下代码
<!-- 这样写,然后在Settings中声明成Settings的内部类,从而不需要单独再写FlashSettingsActivity的实现类
FlashSettingsActivity 并不是一个Activity文件,只是一个SettingsActivity的子类,且是空实现。
之所以要加此空的Activity,是为了外部应用能直接跳转到FlashSettingsActivity界面,因为如果只是fragment的话,外部是没法跳转到fragment界面的,
跳转到FalshSettingsActivity时,会执行其父类SettingsActivity.java中的方法,并根据FlashSettingsActivity在清单文件中的注册信息,
它的meta-data的值,找到FlashSettingsActivity对应的fragment(FlashSettings),显示出fragment界面,实现借壳。
如果<meta-data>中使用的是FRAGMENT_CLASS,一般都会声明成Settings的内部类即 <activity android:name="Settings$xxxActivity" > 的形式。
注意此fragment是继承与settings中通用的SettingsPreferenceFragment,并不是一般的fragment类-->
<activity android:name="Settings$FlashSettingActivity"
android:label="MrloveFragment"
android:icon="@drawable/ic_home_wikofeatures"
android:taskAffinity="">
<intent-filter android:priority="1">
<action android:name="com.android.settings.FLASH_SETTING" />
<action android:name="android.settings.FLASH_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>
<!-- 优先级来确定显示位置 在category中的物理位置(按优先级排序时用到,并不是指第9个位置,数越大优先级越大越靠前) -->
<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" />
<!-- FRAGMENT_CLASS 表明value指定的类是fragment -->
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.FlashSetting" /><!--FlashSettings实现类 -->
<!-- 被管理账户的intent透传
特别说一下com.android.settings.PRIMARY_PROFILE_CONTROLLED,这个在SettingsInitialize.java中有用到,
如果这个值为true,就会调用PackageManager的addCrossProfileIntentFilter()方法,
这个方法的作用是让某些Intent透传到其他Profile而不被本Profile的同名组件所捕获。主要用在被管理账户和主账户之间的数据通信。-->
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
</activity>
②自己实现FlashSetting 这个fragment代码如下:
package com.android.settings;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class FlashSetting extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.right_fragment);
}
}
③在xml文件夹实现right_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="set_local"
android:title="我的位置" />
<CheckBoxPreference
android:defaultValue="true"
android:key="apply_wireless"
android:summary="使用无线网络在应用程序(比如Google地图)中查看位置"
android:title="使用无线网络"></CheckBoxPreference>
</PreferenceScreen>
④在Settings.java中添加
public static class FlashSettingActivity extends SettingsActivity { }
⑤在package com.android.settings.core.gateway;的SettingsGateway.java文件中添加如下代码
一,引入包
import com.android.settings.FlashSetting;
二, 在public static final String[] ENTRY_FRAGMENTS方法中添加:
FlashSetting.class.getName(),
三,在public static final String[] SETTINGS_FOR_RESTRICTED方法中添加:
Settings.FlashSettingActivity.class.getName(),
https://www.jianshu.com/p/2e644c08646d
https://blog.csdn.net/fsc_fantexi/article/details/90668122
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)