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

  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 de 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 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 o 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. 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.