前言

我们在进行日常的开发中,经常会涉及到对系统应用Settings的修改,这里讲一下如何在设置主菜单界面添加一个自定义设置项。

Settings主界面


我们等下要在这个页面再添加一个自定义设置项。

代码修改步骤

  1. 在/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 */ }    ...}
  1. 在/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;    }
  1. 写好MyFragment.java 继承 DashboardFragment ,指定xml,xml里android:fragment使用这个MyFragment。注意点:
  • 我们的逻辑都是在MyFragment里面处理的。根据前面的MySettingsActivity可以看到,它只是一个空壳子。
  • 如果MyFragment.java 不继承 DashboardFragment,可能会出现问题,由于时间久远,博主已经忘了怎么修改了,我们还是尽量继承DashboardFragment
  1. 在/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(),    };}
  1. 在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>
  1. 最后一步,在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上可能有所修改。

更多相关文章

  1. Android中View图形绘制基础
  2. 修改AVD的存放位置
  3. android UI进阶之仿iphone的tab效果 (Android九宫格)
  4. Android(安卓)UI 之TextView控件属性列表
  5. 一个Android健身APP源码(类似KEEP、FEEL、轻+、减约、薄荷等)
  6. android中Invalidate和postInvalidate的区别
  7. Android中app的请求抓包工具 Fiddler 详解
  8. Android(安卓)React Native自定义组件的流程
  9. 关于Android横竖屏的设置和使用

随机推荐

  1. Linux下android ADT 安装不上的解决
  2. 【Android】AlarmManager简介
  3. [转]Android照相程序
  4. Android 获取缩略图
  5. Android 验证码输入框 连续性粘贴 使用第
  6. android 解析xml字符串
  7. android视频截图
  8. Android Stagefright MPEG4Extractor分析
  9. Android 全局异常处理(二)
  10. Android 之 ProgressDialog用法介绍