android8.1 Settings添加一二级菜单

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菜单

Android 8.1Android操作系统的一个版本,它是在Android 8.0基础上进行了改进和优化的最新版本。Android 8.1引入了一些新的功能和改进,例如:自适应图标,通知渠道,自动填充框架等。自适应图标功能使得应用程序的图标可以适应不同的设备和启动器,提供更好的用户体验。通知渠道则使得用户能够更好地管理和控制应用程序发送的通知,减少了用户被打扰的可能性。自动填充框架则简化了用户在输入表单时填写信息的操作,提高了用户填写表单的效率。 Android Studio是开发Android应用程序的集成开发环境。通过Android Studio,开发者可以创建、编辑、调试和测试Android应用程序。在Android Studio中,可以通过“设置”功能对开发环境进行个性化和配置调整。在“设置”菜单中,开发者可以选择和配置不同的主题和UI风格,调整代码编辑器的显示和行为,还可以选择不同的编程语言和版本进行开发。此外,开发者还可以设置和管理各种插件和工具,以满足自己的需求。Android Studio的“设置”功能提供了丰富的选项和配置,使得开发者能够根据自己的喜好和需要对开发环境进行个性化定制,提高了开发效率和舒适度。 总而言之,Android 8.1Android操作系统的最新版本,它引入了一些新的功能和改进,提供了更好的用户体验。Android Studio是一款用于开发Android应用程序的集成开发环境,它提供了丰富的个性化和配置选项,使得开发者能够根据自己的需求对开发环境进行调整和优化。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值