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
usedefine 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_TEMPLATEpara ser transmitido como um argumento, que precisa vir da intent para a atividade (quando fornecida).Para conseguir essas informações, crie um método
newInstancee transmita o modelo quando ele estiver presente (caso contrário, transmita um valor nulo) e atualize a atividade para oDataUsageFragmentou receba as informações de intent diretamente no métodoonAttachusandogetActivity().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.