По большей части перестановка иерархии настроек относительно проста и обычно состоит из перемещения соответствующего предпочтения и 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(...)
Рассмотрим следующий, более сложный пример, который перемещает все настройки во фрагменте «Предупреждение и ограничение данных» на один уровень вверх во фрагмент «Использование данных», который обновляет 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
будет передан в качестве аргумента, который должен поступать от намерения к действию (если он предоставлен).Чтобы получить эту необходимую информацию, либо создайте метод
newInstance
и передайте шаблон, если он присутствует (в противном случае передайте значение null), а затем обновите действие дляDataUsageFragment
, либо получите информацию о намерении непосредственно в методеonAttach
с помощьюgetActivity().getIntent()
. В любом случае вы можете передать необходимую информацию для этого метода, как вы это сделали выше. - Определите любые другие зависимости или ожидаемые действия намерения в старом фрагменте, прежде чем очищать старые фрагменты и файлы XML. В этом случае значение конфигурации наложения указывает на старое действие, которое необходимо обновить, чтобы оно указывало на правильное действие.
Добавьте экран предпочтений в иерархию
Чтобы добавить новый экран предпочтений в иерархию, см. раздел «Добавление настроек автомобиля» .
После создания нового экрана предпочтений используйте приведенные выше примеры, чтобы изменить иерархию предпочтений по своему усмотрению.