Reorganizar configurações do carro

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.

  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);
        }
    }
    

    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é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 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 para DataUsageFragment ou obtenha as informações de intenção diretamente no método onAttach usando getActivity().getIntent() . Em ambos os casos, você pode passar as informações necessárias para este método, como fez acima.

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