Na maioria das vezes, reorganizar a hierarquia de configurações é relativamente
simples e normalmente consiste em mover a preferência relevante e
PreferenceController
para um arquivo XML diferente. Se o
PreferenceController
usar use(...)
, remova-o
do SettingsFragment
anterior e adicione-o ao novo
SettingsFragment
.
Esta página mostra exemplos de como reordenar as Configurações para analisar situações que podem ocorrer.
Mover uma preferência básica
Este exemplo explica como mover uma preferência de uma tela de preferência para outra,
em que a preferência tem apenas um controlador de preferência padrão. Neste exemplo, você
move a preferência "Unidades" da tela de preferências da página inicial para a tela de
preferências do sistema. Para fazer isso, mova o XML a seguir de homepage_fragment.xml
para o
local apropriado em 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>
Mover uma preferência que usa use(...)
Considere o exemplo mais complexo a seguir, que move todas as preferências
no fragmento de aviso e limite de dados para um nível superior no fragmento de uso de dados, que
atualiza DataWarningAndLimitFragment.java
para incluir o método use
para transmitir informações aos controladores de preferência após a construção.
- Mova o XML relevante para o local desejado em
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>
- Em
DataWarningAndLimitFragment.java
, determine como o métodouse
é usado.@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); } }
Nesse caso, o método
use
define o editor de política de rede e o modelo de rede para os controladores de preferência. Como este exemplo move todas as preferências e todo o código no métodoonAttach
é relevante para definir esses parâmetros de preferência, seria apropriado copiar todo o conteúdo do método para o novo fragmento. No entanto, isso varia de acordo com a preferência específica. Você também precisa mover as variáveis de instância relevantes.No entanto, há uma complicação. O fragmento original esperava
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
para ser transmitido como um argumento, que precisa vir da intent para a atividade (quando fornecida).Para conseguir essas informações, crie um método
newInstance
e transmita o modelo quando ele estiver presente (caso contrário, transmita um valor nulo) e atualize a atividade para oDataUsageFragment
ou receba as informações de intent diretamente no métodoonAttach
usandogetActivity().getIntent()
. Em ambos os casos, é possível transmitir as informações necessárias para esse método, como você fez acima. - Identifique outras dependências ou ações de intent esperadas no fragmento antigo antes de limpar os fragmentos e arquivos XML antigos. Nesse caso, um valor de configuração de sobreposição aponta para a atividade antiga, que precisa ser atualizada para apontar para a atividade correta.
Adicionar uma tela de preferência à hierarquia
Para adicionar uma nova tela de preferências à hierarquia, consulte Adicionar configurações do carro.
Depois de criar a nova tela de preferências, use os exemplos acima para reorganizar a hierarquia de preferências conforme necessário.