Na maioria das vezes, reorganizar a hierarquia de configurações é relativamente simples e normalmente consiste em mover a preferência relevante e o PreferenceController
para um arquivo XML diferente. Se o PreferenceController
usar use(...)
, certifique-se de removê-lo do SettingsFragment
anterior e adicioná-lo ao novo SettingsFragment
.
Este artigo fornece exemplos para reordenar as configurações para revisar situações que podem ocorrer.
Movendo uma preferência básica
Este exemplo explica como mover uma preferência de uma tela de preferência para outra, na qual 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 seguinte XML 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>
Movendo uma preferência que usa use(...)
Considere o seguinte exemplo mais complexo que move todas as preferências no fragmento Data Warning & Limit um nível acima no fragmento Data Usage, que atualiza DataWarningAndLimitFragment.java
para incluir o método use
para passar informações para os 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étodo deuse
é 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 dependendo da 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 que
NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE
fosse passado como um argumento, que deveria vir da intenção para a atividade (quando fornecido).Para obter essas informações necessárias, crie um método
newInstance
e passe o modelo quando estiver presente (caso contrário, passe null) e, em seguida, atualize a atividade para oDataUsageFragment
ou obtenha as informações de intenção diretamente no métodoonAttach
usandogetActivity().getIntent()
. Em ambos os casos, você pode passar as informações necessárias para este método como fez acima. - Identifique quaisquer outras dependências ou ações de intenção esperadas no fragmento antigo antes de limpar os fragmentos antigos e os arquivos XML. Nesse caso, um valor de configuração de sobreposição aponta para a atividade antiga, que deve ser atualizada para apontar para a atividade correta.
Adicionando uma tela de preferência à hierarquia
Para adicionar uma nova tela de preferências à hierarquia, consulte Adicionar configurações de carro .
Após criar a nova tela de preferências, use os exemplos acima para reorganizar a hierarquia de preferências conforme desejado.