자동차 설정 재정렬

대부분의 경우 설정 계층 구조 재정렬은 비교적 간단한 작업이며 일반적으로 관련 환경설정과 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 파일을 정리하기 전에 이전 프래그먼트에서 다른 종속 항목이나 예상되는 인텐트 작업을 식별합니다. 이 경우 오버레이 구성 값이 이전 활동을 가리키며 이전 활동은 올바른 활동을 가리키도록 업데이트해야 합니다.

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

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

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