車の設定の並べ替え

ほとんどの場合、設定階層の並べ替えは比較的簡単で、通常は関連する設定と PreferenceController を別の XML ファイルに移動させるだけで完了します。PreferenceControlleruse(...) を使用している場合は、前の 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(...) を使用する設定の移動

次の複雑な例では、データ使用量の警告と制限のフラグメントのすべての設定を 1 つ上のレベルのデータ使用量フラグメントに移動させます。これにより、DataWarningAndLimitFragment.java が更新されて use メソッドが含まれ、構築後に設定コントローラに情報が渡されます。

  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 ファイルをクリーンアップする前に、古いフラグメントで他の依存関係または想定されるインテントのアクションを確認します。この例では、オーバーレイの構成値は古いアクティビティを指しているため、正しいアクティビティを指すように更新する必要があります。

階層への設定画面の追加

新しい設定画面を階層に追加するには、車の設定の追加をご覧ください。

新しい設定画面を作成したら、上記の例を使用して、必要に応じて構成階層を並べ替えます。