Reorganizar as configurações do carro

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.

  1. 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>
  2. Em DataWarningAndLimitFragment.java, determine como o método use é 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étodo onAttach é 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 o DataUsageFragment ou receba as informações de intent diretamente no método onAttach usando getActivity().getIntent(). Em ambos os casos, é possível transmitir as informações necessárias para esse método, como você fez acima.

  3. 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.