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" >andro<id: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=&qu>ot;com.an<droid.car.settings.common.DefaultRestrictionsPreferenceController" intent android:targetPackage="com.android.car.settings" androi>d:tar<getClass=&q>uot;c<om.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="@st>ring/demo<_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController" intent andro>id:ta<rgetPackage>=<"com.android>.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/ /Preference /PreferenceScreen
- 設定キーを
preference_keysに追加します。<resources> [...] <string name="pk_demo_preference_1" translatab>le="false&qu<ot;demo>_pref<erence_1/string string name="pk_demo_preferenc>e_2" transla<table=&>q<uot;false&>quot;demo_preference_2/string /resources - 設定画面キーを
preference_screen_keys.xmlに追加します。<resources> [...] <string name="psk_demo" translatab>le="fa<lse&quo>t<;demo_scre>en/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&<quot; !-- Mark the activity as an injected >setti<ng -- int>ent-filte<r action android:name="com.android.settings.action.E>XTRA_<SETTINGS">/ < /intent-filter !-- Tell CarSettings app which categ>ory i<t belongs to -- meta-data android:name="com.android.settings.category" android:value="com.androi>d.set<tings.category.demo_category"/ !-- Tell CarSettings th>e wha<t the preference title should be -- meta-data android:name="com.android.settings.title"> < android:value="@string/app_name" / !>-- Op<tional: specify the icon to show with the preference -- meta-data android:name="com.android.settings.icon" and>roid:<resource="@drawable/ic_demo" android:va>lue=&<quot;true"/ !-- Optional: Add a summary text when the string is displayed -- meta-data android:n>a<me=">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:expor>ted="<;true" meta-data android:name="distractionOptimiz>ed&qu<ot; andro>id:value=&q<uot;true&quo>t;/ /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.Defau>ltRestric<tionsPreferenceController" intent android:act>i<on="an>droid.intent.action.DEMO_ACTION"/ /Preference
挿入設定を追加する
挿入設定には、外部アクティビティや内部アクティビティを引き起こすインテントが含まれています。たとえば、設定ホームページの Google の設定項目は、挿入設定になります。挿入設定は、次のいずれかに該当する場合に便利です。設定が以下の場合:
挿入設定としてアクティビティを設定するには:
CarSettings アプリの特定のページに挿入設定を表示するには、次のサンプルコードを XML に含めて、必要に応じて変数を変更します。
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings&<quot; !-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected prefe>rences. -- settings:controller="com.android.settings.common.ExtraSettingsPrefer>enceC<ontroller" !-- Tells the controller what activities should be pulled into this preferenc>e < group. -- intent android:action="com.android.settin>gs.action<.EXTRA_SETTINGS" !-- Name and value should match th>e metadat<a in your activity -- extra android:name="com.android.settings.category" android:value=">com.a<ndroid.>s<ettings.category.demo_category"/ /intent /com.>android.car.settings.common.LogicalPreferenceGroup