자동차 설정의 대부분 페이지는 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" 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
를 사용합니다. 두 번째 환경설정에서는 정의해야 하는 맞춤 환경설정 컨트롤러를 사용합니다. 예를 들어, 사용 가능한 관리자에게만 이 환경설정을 맞춤설정할 수 있습니다. 이를 위해 다음 맞춤 컨트롤러를 정의합니다.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>