android8.1 Settings添加一二级菜单

本文介绍如何在MTK8.1系统中定制设置菜单,包括添加一级菜单和二级菜单的具体步骤,涉及修改SettingsActivity、SettingsGateway、AndroidManifest.xml等文件,以及创建新的Fragment和PreferenceController。
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菜单

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值