Na maior parte, 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(...)
, certifique-se de removê-lo do SettingsFragment
anterior e adicioná-lo ao novo SettingsFragment
.
Esta página fornece exemplos de reordenação de configurações para revisar situações que podem ocorrer.
Mover uma preferência básica
Este exemplo explica como mover uma preferência de uma tela de preferências para outra, na qual a preferência possui 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>
Mova uma preferência que use use(...)
Considere o seguinte exemplo mais complexo que move todas as preferências no fragmento Data Warning & Limit um nível acima para o 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é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); } }
Neste 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 passar pelas 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 presente (caso contrário, passe nulo) e, em seguida, atualize a atividade paraDataUsageFragment
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. Neste caso, um valor de configuração de sobreposição aponta para a atividade antiga, que deve ser atualizada para apontar para a atividade correta.
Adicione uma tela de preferências à 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 desejado.