我们在进行日常的开发中,经常会涉及到对系统应用Settings的修改,这里讲一下如何在设置主菜单界面添加一个自定义设置项。
Settings主界面
我们等下要在这个页面再添加一个自定义设置项。
// /src/com/android/settings/Settings.java
public 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
// 两个地方调用:主菜单界面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;
}
/src/com/android/settings/core/gateway/SettingsGateway.java
public class SettingsGateway {
public static final String[] ENTRY_FRAGMENTS = {
...
HoneywellSettings.class.getName(),
MyFragment.class.getName(),
};
public static final String[] SETTINGS_FOR_RESTRICTED = {
...
MySettingsActivity.class.getName(),
};
}
<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>
// /src/com/android/settings/mysettings/MyFragment.java
public 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上可能有所修改。
ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可...
本文将研究 ES6 的 for ... of 循环。 旧方法 在过去,有两种方法可以遍历 javas...
前言 相信大家都知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也...
微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很...
【排序算法】之lowb三人组冒泡、插入、选择 什么是lowb三人组 冒泡排序bubble so...
计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持...
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
一、正则表达式概述 二、正则表达式在VBScript中的应用 三、正则表达式在VavaScr...
vbs:把一段文字中指定字符颜色变成红色的正则 functionc(Tstr,Word) Dimre Setre...
一石激起千层浪,继中国区浩浩荡荡的大裁员告一段落之后,甲骨文并未因此收起手...