OS:MTK 8.1

需求:设置中添加一级菜单,在添加的一级菜单下再添加一个二级菜单,二级菜单添加方法与之前有点区别。

1.添加一个扫描设置项
  • packages/apps/Settings/src/com/android/settings/Settings.java
 public static class ScanSettingActivity extends SettingsActivity{}
  • packages/apps/Settings/src/com/android/settings/core/gateway/SettingsGateway.java
 public static final String[] ENTRY_FRAGMENTS = {             WebViewAppPicker.class.getName(),             LockscreenDashboardFragment.class.getName(),             BluetoothDeviceDetailsFragment.class.getName(),-            DataUsageList.class.getName()+            DataUsageList.class.getName(),+            ScanSettingFragment.class.getName() public static final String[] SETTINGS_FOR_RESTRICTED = {  ...             Settings.DateTimeSettingsActivity.class.getName(),             Settings.DeviceInfoSettingsActivity.class.getName(),             Settings.EnterprisePrivacySettingsActivity.class.getName(),     +       Settings.ScanSettingActivity.class.getName()     };

在AndroidManifest.xml中配置

  • packages/apps/Settings/AndroidManifest.xml
+ <activity android:name="Settings$ScanSettingActivity"           android:label="@string/scan_settings"           android:icon="@mipmap/lzy_scan">           <intent-filter android:priority="8">                    <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"                    android:value="com.android.settings.scan.ScanSettingFragment" />           <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"                    android:value="true" />+  </activity>

android:priority="9"加这个属性与位置顺序有关

 <intent-filter android:priority="8">           <action android:name="com.android.settings.action.SETTINGS" /> </intent-filter>

添加此项(value)才会在一级菜单中显示,与电池,声音等设置项同级

 <meta-data android:name="com.android.settings.category"            android:value="com.android.settings.category.ia.homepage"/>

此项表示实现类是一个fragment,value指向具体的fragment

 <meta-data android:name="com.android.settings.FRAGMENT_CLASS"            android:value="com.android.settings.scan.ScanSettingFragment" />

这项不知道表示啥意思,貌似其他项都有加

<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"           android:value="true" />
2.添加设置项的实现fragment
  • packages/apps/Settings/src/com/android/settings/scan/ScanSettingFragment.java 新建ScanSettingFragment.java
 public class ScanSettingFragment extends DashboardFragment{                 public static final String TAG = "ScanSettingFragment";         @Override     protected String getLogTag() {        return TAG;     }     @Override     public void onAttach(Context context) {         super.onAttach(context);         mProgressiveDisclosureMixin.setTileLimit(4);   // 当子菜单多于4项时,其他项会被折叠隐藏起来,具体效果可参考显示设置项     }     @Override     protected int getPreferenceScreenResId() {         return R.xml.scan_settings;     }     @Override     protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {         return buildPreferenceControllers(context, getLifecycle());     }     @Override     protected int getHelpResource() {         return R.string.help_uri_display;     }            @Override     public int getMetricsCategory() {         return MetricsEvent.SCAN_SETTING;         }     private static List<AbstractPreferenceController> buildPreferenceControllers(             Context context, Lifecycle lifecycle) {         final List<AbstractPreferenceController> controllers = new ArrayList<>();         return controllers;    }  }

添加布局文件scan_settings.xml

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"     android:title="@string/scan_settings">     <SwitchPreference         android:key="suspend_ball"         android:title="@string/suspend_ball_title"         android:summary="@string/suspend_ball_summary" />          </PreferenceScreen>  

添加MetricsEvent.SCAN_SETTING;

位置: frameworks/base/proto/src/metrics_constants.proto // OPEN: Settings > Scan     // CATEGORY: SETTINGS    // OS: N    SCAN_SETTING = 1145;
3.添加二级菜单

3.1在布局文件scan_settings.xml中添加一个SwitchPreference,如上
3.2在ScanSettingFragment.java 中添加

 + private static final String KEY_SUSPEND_BALL = "suspend_ball";   private static List<AbstractPreferenceController> buildPreferenceControllers(             Context context, Lifecycle lifecycle) {         final List<AbstractPreferenceController> controllers = new ArrayList<>(); +       controllers.add(new ScanSuspendballConctoller(context, KEY_SUSPEND_BALL));         return controllers;   } 
4.二级菜单实现类
public class ScanSuspendballConctoller extends AbstractPreferenceController implements                        Preference.OnPreferenceChangeListener {     private Context mContext;     private final String mSuspendBallKey;            private final String SUSPEND_CONTOL_ACTION = "com.android.suspend_mode_change";     public ScanSuspendballConctoller(Context context, String key) {         super(context);         mContext = context;         mSuspendBallKey = key;     }                @Override     public boolean isAvailable() {         return true;     }                @Override     public String getPreferenceKey() {         return mSuspendBallKey;     }     @Override     public void updateState(Preference preference) {         int suspendBallMode = Settings.System.getInt(mContext.getContentResolver(),                 "suspend_ball", 0);         ((SwitchPreference) preference).setChecked(suspendBallMode != 0);     }                             @Override     public boolean onPreferenceChange(Preference preference, Object newValue) {         boolean auto = (Boolean) newValue;         Settings.System.putInt(mContext.getContentResolver(), "suspend_ball", auto ? 1: 0);                          Intent intent = new Intent();         intent.setAction(SUSPEND_CONTOL_ACTION);         intent.putExtra("suspend_mode",auto);         mContext.sendBroadcast(intent);               return true;     }                    }

这里不再把所有子菜单的功能都放到ScanSettingFragment.java中实现,而是单独提取出来,也可以按照6.0的写法添加。

参考packages/apps/Settings/src/com/android/settings/DisplaySettings.java中的写法

5.隐藏二级菜单

如果以上述的方法添加,isAvailable()方法返回false就好了

 @Override public boolean isAvailable() {   return false; }  

隐藏setting菜单

更多相关文章

  1. Android(安卓)设置View点击区域
  2. android 平台上SQLite3中文乱码 --我的小bug
  3. ECLIPSE android 布局页面文件出错故障排除Exception raised dur
  4. Android(安卓)GreenDao数据库使用
  5. Android新特性-RecyclerView之基础篇
  6. Android(安卓)异步任务 设置 超时使用handler更新通知功能
  7. 如何在Android系统中添加系统服务(以PowerManager为例)
  8. android studio基础知识2 -- 设置代理,轻松下载sdk
  9. Android(安卓)socket通信 真机io错误 模拟器正常的原因

随机推荐

  1. Andoroid学习笔记05——Activity布局管理
  2. Android(安卓)Audio 框架简读
  3. Android最新敲诈者病毒分析及解锁(11月版)
  4. android判断是否联网
  5. Android ADB始终为unautorized的解决
  6. Android Studio 使用本地的gradle
  7. app性能优化
  8. Android 实现高斯模糊效果
  9. Android Studio自定义模板:简单自定义Devi
  10. listView背景设置