자동차 설정의 대부분 페이지는 SettingsFragment를 확장하는 일련의 프래그먼트로 구현되며, 각 프래그먼트에는 CarSettingActivities에 정의된 자체 활동이 있습니다.
이러한 정적 활동은 BaseCarSettingsActivity에서 확장됩니다.
이러한 설정 외에도 CarSettings에 표시되도록 다른 시스템 앱의 환경설정을 삽입할 수 있습니다.
자동차 설정에 새 환경설정 추가
새 설정을 추가하려면 다음 단계를 따르세요.
- XML 파일을 정의합니다.
- 모든 환경설정에서
android:key를 정의했는지 확인합니다. 키 목록은preference_keys.xml에서 유지합니다. 환경설정 키는 고유해야 합니다. - 검색 색인 생성을 위해 환경설정 화면에도
android:key가 정의되어 있어야 합니다. 환경설정 화면 키 목록은preference_screen_keys.xml에서 유지합니다. 환경설정 화면 키도 고유해야 합니다. - 환경설정에 정적 정보만 표시하는 경우(예: 특별한 비즈니스 로직이 없는 경우) 환경설정 컨트롤러를
com.android.car.settings.common.DefaultRestrictionsPreferenceController로 설정합니다. - 환경설정에 비즈니스 로직이 필요한 경우 환경설정 컨트롤러를 새 환경설정 컨트롤러 이름으로 설정합니다.
- 모든 환경설정에서
- (필요한 경우)
PreferenceController를 확장하는 적절한 패키지에 환경설정 컨트롤러를 만듭니다. 필요한 경우 Javadoc을 참고하세요. - 1단계에서 정의한 XML 파일을 반환하는
getPreferenceScreenResId를 사용하여 프래그먼트를 만듭니다. CarSettingActivities에서BaseCarSettingsActivity를 확장하는 활동을 만든 다음getInitialFragment()를 구현하여 3단계에서 정의한 프래그먼트를 반환합니다.- 4단계에 정의된 활동을 포함하도록
AndroidManifest.xml을 업데이트합니다.
예
다음은 이 과정을 설명합니다.
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를 사용합니다. 두 번째 환경설정에서는 정의해야 하는 맞춤 환경설정 컨트롤러를 사용합니다. 예를 들어, 사용 가능한 관리자에게만 이 환경설정을 맞춤설정할 수 있습니다. 이를 위해 다음 맞춤 컨트롤러를 정의합니다.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
자동차 설정에 외부 인텐트 환경설정 추가
삽입된 환경설정의 대안으로 다른 앱에 인텐트로 전달하는 환경설정을 자동차 설정에 직접 삽입할 수도 있습니다. 이 작업은 외부 앱으로 확인되는 인텐트 작업을 사용하여 환경설정 화면에 환경설정을 추가하면 됩니다. 자동차 설정의 다른 환경설정과 같이 이러한 환경설정에서는 동일한 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