前言
我們在進行日常的開發中,經常會涉及到對系統應用Settings的修改,這里講一下如何在設定主選單界面添加一個自定義設定項,
Settings主界面

我們等下要在這個頁面再添加一個自定義設定項,
代碼修改步驟
- 在/src/com/android/settings/Settings.java添加入口Activity:
// /src/com/android/settings/Settings.java
public class Settings extends SettingsActivity {
// 這個便是我們要添加的設定項
public static class MySettingsActivity extends SettingsActivity {}
public static class AssistGestureSettingsActivity extends SettingsActivity { /* empty */}
public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
public static class SimSettingsActivity extends SettingsActivity { /* empty */ }
...
}
- 在/src/com/android/settings/SettingsActivity.java#doUpdateTilesList修改控制選單項的顯示:
// /src/com/android/settings/SettingsActivity.java
// 兩個地方呼叫:主選單界面onResume 和 ACTION_BATTERY_CHANGED廣播中EXTRA_PRESENT變化
private void doUpdateTilesList() {
PackageManager pm = getPackageManager();
final UserManager um = UserManager.get(this);
final boolean isAdmin = um.isAdminUser();
boolean somethingChanged = false;
String packageName = getPackageName();
// 這個true就是表示此選單項顯示與否
somethingChanged = setTileEnabled(new ComponentName(packageName, MySettingsActivity.class.getName()), true, isAdmin)
|| somethingChanged;
if (somethingChanged) {
// 用于更新整個設定串列
updateCategories();
}
}
// 這個是博主控制顯示與否的條件
public boolean setTileEnabled(ComponentName component, boolean enabled) {
PackageManager pm = getPackageManager();
int state = pm.getComponentEnabledSetting(component);
boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
if (enabled) {
sTileBlacklist.remove(component);
} else {
sTileBlacklist.add(component);
}
pm.setComponentEnabledSetting(component, enabled
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
return true;
}
return false;
}
- 寫好MyFragment.java 繼承 DashboardFragment ,指定xml,xml里android:fragment使用這個MyFragment,注意點:
- 我們的邏輯都是在MyFragment里面處理的,根據前面的MySettingsActivity可以看到,它只是一個空殼子,
- 如果MyFragment.java 不繼承 DashboardFragment,可能會出現問題,由于時間久遠,博主已經忘了怎么修改了,我們還是盡量繼承DashboardFragment
- 在/src/com/android/settings/core/gateway/SettingsGateway.java修改
ENTRY_FRAGMENTS和SETTINGS_FOR_RESTRICTED
添加類名com.android.settings.mysettings.MyFragment.class.getName()和Settings.MySettingsActivity.class.getName()
/src/com/android/settings/core/gateway/SettingsGateway.java
public class SettingsGateway {
public static final String[] ENTRY_FRAGMENTS = {
...
HoneywellSettings.class.getName(),
MyFragment.class.getName(),
};
public static final String[] SETTINGS_FOR_RESTRICTED = {
...
MySettingsActivity.class.getName(),
};
}
- 在AndroidManifest.xml指定Activity和Fragment的對應關系,現在我們的Activity和Fragment都已經準備好了,該把它們關聯起來了,
<activity android:name=".Settings$MySettingsActivity">
// 選單項排序
<intent-filter android:priority="2">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
// 選單項下面的說明字體
<meta-data android:name="com.android.settings.summary"
android:value="這是我的設定選單"/>
// 表示這是一個主界面activity
<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.mysettings.MyFragment"/>
</activity>
- 最后一步,在MyFragment里書寫你的邏輯代碼,這里博主給出自己的:
// /src/com/android/settings/mysettings/MyFragment.java
public class MyFragment extends DashboardFragment {
@Override
protected int getPreferenceScreenResId() {
return R.xml.mysettings;
}
@Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
private static List<AbstractPreferenceController> buildPreferenceControllers(
Context context, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
return controllers;
}
final SwitchPreference pref = (SwitchPreference)getPreferenceScreen().findPreference(key);
}
結語
以上就是在設定主界面里添加新選單項的所有內容了,大家可以參照著寫一下,因為這是基于Android O版本的Settings,在Android Q上可能有所修改,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/278105.html
標籤:其他
