CarSettings のほとんどのページは、SettingsFragment
を拡張する一連のフラグメントとして実装され、各フラグメントには CarSettingActivities
で定義された独自のアクティビティがあります。これらの静的アクティビティは、BaseCarSettingsActivity
から拡張されます。こうした設定に加えて、他のシステムアプリから設定を追加し、CarSettings に表示することもできます。
CarSettings に新しい設定を追加する
新しい設定を追加するには:
- XML ファイルを定義します。
- すべての設定で
android:key
が定義されていることを確認します。キーのリストはpreference_keys.xml
で維持されます。設定キーは一意である必要があります。 - 検索インデックス作成のため、設定画面に
android:key
が定義されている必要があります。設定画面のキーのリストはpreference_screen_keys.xml
で維持されます。設定画面キーは一意でなければなりません。 - 設定に静的情報のみを表示する場合(特殊なビジネス ロジックがないなど)は、設定コントローラを
com.android.car.settings.common.DefaultRestrictionsPreferenceController
に設定します。 - 設定にビジネス ロジックが必要な場合は、設定コントローラを新しい設定コントローラ名で設定します。
- すべての設定で
- (必要な場合)
PreferenceController
を拡張する適切なパッケージで設定コントローラを作成します。必要に応じて、Javadoc をご覧ください。 getPreferenceScreenResId
でフラグメントを作成し、ステップ 1 で定義した XML ファイルを返すように指定します。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>
CarSettings 内に外部インテントの設定を追加する
挿入設定の代替として、別のアプリにインテントを送信する設定を CarSettings に挿入することもできます。この場合は、外部アプリに解決されるインテント アクションとともに設定画面に設定を追加するだけです。CarSettings の他の設定と同様に、これらの設定にも同じ 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>