車の設定のほとんどのページは、SettingsFragment
を拡張する一連のフラグメントとして実装され、各フラグメントには CarSettingActivities
で定義された独自のアクティビティがあります。
これらの静的アクティビティは、BaseCarSettingsActivity
から拡張されます。こうした設定に加えて、他のシステム アプリから設定を挿入して、車の設定に表示できます。
車の設定に新しい設定を追加する
新しい設定を追加するには:
- XML ファイルを定義します。
- すべての設定で
android:key
が定義されていることを確認します。キーのリストはpreference_keys.xml
で維持されます。設定キーは一意である必要があります。 - 検索インデックス作成のため、設定画面に
android:key
が定義されている必要があります。設定画面のキーのリストはpreference_screen_keys.xml
で維持されます。設定画面キーは一意でなければなりません。 - 設定に静的情報のみを表示する場合(特殊なビジネス ロジックがないなど)は、設定コントローラを
com.android.car.settings.common.DefaultRestrictionsPreferenceController
に設定します。 - 設定にビジネス ロジックが必要な場合は、設定コントローラを新しい設定コントローラ名で設定します。
- すべての設定で
- (必要な場合)
PreferenceController
を拡張する適切なパッケージで設定コントローラを作成します。必要に応じて Javadoc をご覧ください。 - ステップ 1 で定義した XML ファイルを返す
getPreferenceScreenResId
を使用してフラグメントを作成します。 BaseCarSettingsActivity
を拡張するCarSettingActivities
でアクティビティを作成してから、getInitialFragment()
(ステップ 3 で定義されたフラグメントを返します)を実装します。AndroidManifest.xml
を更新して、ステップ 4 で定義されたアクティビティを含めます。
例
以下の資料では、このプロセスを示しています。
demo_fragment.xml
という名前の XML ファイルを定義します。<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
- 設定キーを
preference_keys
に追加します。<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources>
- 設定画面キーを
preference_screen_keys.xml
に追加します。<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
最初の設定例では、
DefaultRestrictionsPreferenceController
を使用します。2 番目の設定には、カスタム設定コントローラを使用します。このコントローラは定義する必要があります。この例では、利用可能な管理ユーザーのみにこの設定をカスタマイズできます。これを行うには、以下のようにカスタム コントローラを定義します。public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- フラグメントを作成するには、
getPreferenceScreenResId
をオーバーライドします。 - 新しいフラグメントを保持するには、
CarSettingActivities
でアクティビティを作成します。 - 新しいアクティビティでマニフェスト ファイルを更新します。
- CarSettings アプリに直接実装されない(OEM によって実装された設定を追加する場合など)。
- CarSettings アプリに表示される
- アクティビティを挿入設定として指定するには、アクティビティにインテント フィルタを追加します。
- CarSettings アプリに所属カテゴリを通知します。カテゴリは
CategoryKey
で定義される定数であり、挿入設定を表示する CarSettings のレベルを指定するのに使用されます。CategoryKey
内にカテゴリセットを用意していますが、OEM が独自のカテゴリを定義する際の制限はありません。 - (省略可)設定が表示されるときの概要テキストを追加します。
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
車の設定内に外部インテントの設定を追加する
挿入設定の代わりに、別のアプリケーションにインテントを送信する設定を車の設定に直接挿入することもできます。これは、外部アプリケーションに解決されるインテント アクションを含む設定画面に設定を追加するだけで実現できます。車の設定の他の設定と同様に、これらの設定にも同じ XML 属性が使用できます。
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
挿入設定を追加する
挿入設定には、外部アクティビティや内部アクティビティを引き起こすインテントが含まれています。たとえば、設定ホームページの Google の設定項目は、挿入設定になります。挿入設定は、次のいずれかに該当する場合に便利です。設定が以下の場合:
挿入設定としてアクティビティを設定するには:
CarSettings アプリの特定のページに挿入設定を表示するには、次のサンプルコードを XML に含めて、必要に応じて変数を変更します。
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>