자동차 설정 재정렬

대부분의 경우 설정 계층 구조 재정렬은 비교적 간단한 작업이며 일반적으로 관련 환경설정과 PreferenceController를 다른 XML 파일로 이동하는 작업으로 구성됩니다. PreferenceController에서 use(...)를 사용하면 이전 SettingsFragment에서 삭제한 후 새 SettingsFragment에 추가해야 합니다.

이 페이지에서는 설정을 재정렬하는 예를 제공하여 발생할 수 있는 상황을 검토합니다.

기본 환경설정 이동

이 예에서는 한 환경설정 화면에서 다른 환경설정 화면으로 환경설정을 이동하는 방법을 설명합니다. 여기서 환경설정에는 기본 환경설정 컨트롤러만 있습니다. 이 예에서 개발자는 단위 환경설정을 홈페이지 환경설정 화면에서 시스템 환경설정 화면으로 이동합니다. 이렇게 하려면 다음 XML을 homepage_fragment.xml에서 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>

use(...)를 사용하는 환경설정 이동

다음은 데이터 경고 및 제한 프래그먼트의 모든 환경설정을 한 레벨 위인 데이터 사용량 프래그먼트로 이동하는 좀 더 복잡한 예를 살펴보겠습니다. 데이터 사용량 프래그먼트는 use 메서드를 포함하도록 DataWarningAndLimitFragment.java를 업데이트하여 생성 후 환경설정 컨트롤러에 정보를 전달합니다.

  1. 관련 XML을 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. DataWarningAndLimitFragment.java에서 use 메서드의 사용 방법을 결정합니다.
    @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);
        }
    }
    

    이 경우 use 메서드는 환경설정 컨트롤러의 네트워크 정책 편집기 및 네트워크 템플릿을 설정합니다. 이 예에서는 모든 환경설정을 이동하고 onAttach 메서드의 모든 코드가 이러한 환경설정 매개변수를 설정하는 것과 관련이 있으므로 전체 메서드 콘텐츠를 새 프래그먼트로 복사하는 것이 적절할 수 있습니다. 그러나 이는 특정 환경설정에 따라 달라집니다. 관련 인스턴스 변수도 이동해야 합니다.

    그러나 문제가 있습니다. 원본 프래그먼트는 NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE이 인수로 전달될 것으로 예상했습니다. 이 인수는 제공된 경우 인텐트에서 활동으로 전달되어야 합니다.

    필요한 이 정보를 가져오려면 newInstance 메서드를 만들어 있는 경우 템플릿을 전달하고(없으면 null 전달) DataUsageFragment의 활동을 업데이트하거나 getActivity().getIntent()를 사용하여 onAttach 메서드에서 직접 인텐트 정보를 가져옵니다. 어느 경우든 위에서 실행한 것처럼 이 메서드에 필요한 정보를 전달할 수 있습니다.

  3. 이전 프래그먼트와 XML 파일을 정리하기 전에 이전 프래그먼트에서 다른 종속 항목이나 예상되는 인텐트 작업을 식별합니다. 이 경우 오버레이 구성 값이 이전 활동을 가리키며 이전 활동은 올바른 활동을 가리키도록 업데이트해야 합니다.

계층 구조에 환경설정 화면 추가

계층 구조에 새 환경설정 화면을 추가하려면 자동차 설정 추가를 참고하세요.

새 환경설정 화면을 만든 후 위의 예를 사용하여 환경설정 계층 구조를 원하는 대로 재정렬합니다.