Android(安卓)O添加Settings设置项的方法
16lz
2021-12-04
前言
我们在进行日常的开发中,经常会涉及到对系统应用Settings的修改,这里讲一下如何在设置主菜单界面添加一个自定义设置项。
Settings主界面
我们等下要在这个页面再添加一个自定义设置项。
代码修改步骤
- 在/src/com/android/settings/Settings.java添加入口Activity:
// /src/com/android/settings/Settings.javapublic class Settings extends SettingsActivity { // 这个便是我们要添加的设置项 public static class MySettingsActivity extends SettingsActivity { } public static class AssistGestureSettingsActivity extends SettingsActivity { /* empty */} public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ } public static class SimSettingsActivity extends SettingsActivity { /* empty */ } ...}
- 在/src/com/android/settings/SettingsActivity.java#doUpdateTilesList修改控制菜单项的显示:
// /src/com/android/settings/SettingsActivity.java// 两个地方调用:主菜单界面onResume 和 ACTION_BATTERY_CHANGED广播中EXTRA_PRESENT变化private void doUpdateTilesList() { PackageManager pm = getPackageManager(); final UserManager um = UserManager.get(this); final boolean isAdmin = um.isAdminUser(); boolean somethingChanged = false; String packageName = getPackageName();// 这个true就是表示此菜单项显示与否 somethingChanged = setTileEnabled(new ComponentName(packageName, MySettingsActivity.class.getName()), true, isAdmin) || somethingChanged; if (somethingChanged) { // 用于更新整个设置列表 updateCategories(); }}// 这个是博主控制显示与否的条件public boolean setTileEnabled(ComponentName component, boolean enabled) { PackageManager pm = getPackageManager(); int state = pm.getComponentEnabledSetting(component); boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { if (enabled) { sTileBlacklist.remove(component); } else { sTileBlacklist.add(component); } pm.setComponentEnabledSetting(component, enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); return true; } return false; }
- 写好MyFragment.java 继承 DashboardFragment ,指定xml,xml里android:fragment使用这个MyFragment。注意点:
- 我们的逻辑都是在MyFragment里面处理的。根据前面的MySettingsActivity可以看到,它只是一个空壳子。
- 如果MyFragment.java 不继承 DashboardFragment,可能会出现问题,由于时间久远,博主已经忘了怎么修改了,我们还是尽量继承DashboardFragment
- 在/src/com/android/settings/core/gateway/SettingsGateway.java修改
ENTRY_FRAGMENTS和SETTINGS_FOR_RESTRICTED
添加类名com.android.settings.mysettings.MyFragment.class.getName()和Settings.MySettingsActivity.class.getName()
/src/com/android/settings/core/gateway/SettingsGateway.javapublic class SettingsGateway { public static final String[] ENTRY_FRAGMENTS = { ... HoneywellSettings.class.getName(), MyFragment.class.getName(), }; public static final String[] SETTINGS_FOR_RESTRICTED = { ... MySettingsActivity.class.getName(), };}
- 在AndroidManifest.xml指定Activity和Fragment的对应关系。现在我们的Activity和Fragment都已经准备好了,该把它们关联起来了。
<activity android:name=".Settings$MySettingsActivity">// 菜单项排序 <intent-filter android:priority="2"> <action android:name="com.android.settings.action.SETTINGS"/> </intent-filter> // 菜单项下面的说明字体 <meta-data android:name="com.android.settings.summary" android:value="这是我的设置菜单"/> // 表示这是一个主界面activity <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" android:value="com.android.settings.mysettings.MyFragment"/></activity>
- 最后一步,在MyFragment里书写你的逻辑代码。这里博主给出自己的:
// /src/com/android/settings/mysettings/MyFragment.javapublic class MyFragment extends DashboardFragment { @Override protected int getPreferenceScreenResId() { return R.xml.mysettings; } @Override protected List<AbstractPreferenceController> getPreferenceControllers(Context context) { return buildPreferenceControllers(context, getLifecycle()); } private static List<AbstractPreferenceController> buildPreferenceControllers( Context context, Lifecycle lifecycle) { final List<AbstractPreferenceController> controllers = new ArrayList<>(); return controllers; }final SwitchPreference pref = (SwitchPreference)getPreferenceScreen().findPreference(key);}
结语
以上就是在设置主界面里添加新菜单项的所有内容了,大家可以参照着写一下,因为这是基于Android O版本的Settings,在Android Q上可能有所修改。
更多相关文章
- Android中View图形绘制基础
- 修改AVD的存放位置
- android UI进阶之仿iphone的tab效果 (Android九宫格)
- Android(安卓)UI 之TextView控件属性列表
- 一个Android健身APP源码(类似KEEP、FEEL、轻+、减约、薄荷等)
- android中Invalidate和postInvalidate的区别
- Android中app的请求抓包工具 Fiddler 详解
- Android(安卓)React Native自定义组件的流程
- 关于Android横竖屏的设置和使用