В большинстве случаев изменить иерархию настроек довольно просто. Обычно достаточно перенести нужный параметр и PreferenceController в другой XML-файл. Если PreferenceController использует use(...), удалите его из предыдущего SettingsFragment и добавьте в новый SettingsFragment.
На этой странице приведены примеры изменения порядка настроек, чтобы вы могли ознакомиться с ситуациями, которые могут возникнуть.
Как переместить базовую настройку
В этом примере показано, как перенести параметр с одного экрана настроек на другой, если у параметра есть только контроллер настроек по умолчанию. В этом примере вы переносите параметр "Единицы измерения" с экрана настроек главной страницы на экран системных настроек. Для этого переместите следующий XML-код из homepage_fragment.xml в соответствующее место в system_settings_fragment.xml:
<Preference android:icon="@drawable/ic_settings_units" android:key="@string/pk_units_settings_entry" android:title="@string/units_settings" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$UnitsSettingsActivity"/> </Preference>
Перемещение настройки, в которой используется use(...)
Рассмотрим более сложный пример, в котором все настройки из фрагмента Data Warning & Limit переносятся на один уровень вверх во фрагмент Data Usage. В результате DataWarningAndLimitFragment.java обновляется и включает метод use для передачи информации в контроллеры настроек после создания.
- Переместите нужный XML-код в нужное место в
data_usage_fragment.xml:<Preference android:key="@string/pk_data_usage_cycle" android:title="@string/app_usage_cycle" settings:controller="com.android.car.settings.datausage.CycleResetDayOfMonthPickerPreferenceController"/> <com.android.car.settings.common.LogicalPreferenceGroup android:key="@string/pk_data_warning_group" settings:controller="com.android.car.settings.datausage.DataWarningPreferenceController"> <SwitchPreference android:key="@string/pk_data_set_warning" android:title="@string/set_data_warning"/> <Preference android:key="@string/pk_data_warning" android:title="@string/data_warning"/> </com.android.car.settings.common.LogicalPreferenceGroup> <com.android.car.settings.common.LogicalPreferenceGroup android:key="@string/pk_data_limit_group" settings:controller="com.android.car.settings.datausage.DataLimitPreferenceController"> <SwitchPreference android:key="@string/pk_data_set_limit" android:title="@string/set_data_limit"/> <Preference android:key="@string/pk_data_limit" android:title="@string/data_limit"/> </com.android.car.settings.common.LogicalPreferenceGroup>
- В
DataWarningAndLimitFragment.javaопределите, как используется методuse.@Override public void onAttach(Context context) { super.onAttach(context); mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context)); mNetworkTemplate = getArguments().getParcelable( NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE); if (mNetworkTemplate == null) { mTelephonyManager = context.getSystemService(TelephonyManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class); mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager, DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager)); } // Loads the current policies to the policy editor cache. mPolicyEditor.read(); List<DataWarningAndLimitBasePreferenceController> preferenceControllers = Arrays.asList( use(CycleResetDayOfMonthPickerPreferenceController.class, R.string.pk_data_usage_cycle), use(DataWarningPreferenceController.class, R.string.pk_data_warning_group), use(DataLimitPreferenceController.class, R.string.pk_data_limit_group)); for (DataWarningAndLimitBasePreferenceController preferenceController : preferenceControllers) { preferenceController.setNetworkPolicyEditor(mPolicyEditor); preferenceController.setNetworkTemplate(mNetworkTemplate); } }
В этом случае метод
useзадает редактор правил сети и шаблон сети для контроллеров предпочтений. Поскольку в этом примере переносятся все настройки и весь код в методеonAttachотносится к установке этих параметров, целесообразно скопировать все содержимое метода в новый фрагмент. Однако это зависит от конкретных настроек. Вам также нужно перенести соответствующие переменные экземпляра.Однако есть нюанс. Оригинальный фрагмент должен был быть
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATEпередан в качестве аргумента, который должен был быть получен из намерения для объекта activity (если он был предоставлен).Чтобы получить нужную информацию, создайте метод
newInstance, передайте в него шаблон, если он есть (в противном случае передайте null), а затем обновите действие дляDataUsageFragmentили получите информацию о намерении непосредственно в методеonAttach, используяgetActivity().getIntent(). В любом случае вы можете передать необходимую информацию для этого метода так же, как и выше. - Прежде чем удалять старые фрагменты и XML-файлы, определите, есть ли в них другие зависимости или ожидаемые действия интента. В этом случае значение конфигурации оверлея указывает на старое действие, и его нужно изменить, чтобы оно указывало на правильное действие.
Добавление экрана настроек в иерархию
Чтобы добавить в иерархию новый экран настроек, следуйте инструкциям в разделе Как добавить настройки автомобиля.
После создания нового экрана настроек используйте приведенные выше примеры, чтобы изменить иерархию настроек по своему усмотрению.