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