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