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;
}