Większość stron w Car Settings jest zaimplementowana jako seria fragmentów rozszerzających SettingsFragment
, przy czym każda z nich ma własną aktywność zdefiniowaną w CarSettingActivities
. Te statyczne działania są rozszerzone z BaseCarSettingsActivity
. Oprócz tych ustawień możesz wprowadzić preferencje z innych aplikacji systemowych, aby wyświetlić je w ustawieniach samochodu.
Dodaj nowe preferencje w Ustawieniach samochodu
Aby dodać nowe ustawienie:
- Zdefiniuj plik XML:
- Upewnij się, że wszystkie preferencje zdefiniowały
android:key
. Lista kluczy jest przechowywana w plikupreference_keys.xml
. Klucze preferencji powinny być unikalne. - Na potrzeby indeksowania wyszukiwania ekrany preferencji powinny również mieć zdefiniowany
android:key
. Lista klawiszy ekranu preferencji jest przechowywana wpreference_screen_keys.xml
. Klawisze ekranu preferencji również powinny być unikalne. - Jeśli preferencja wyświetla tylko informacje statyczne (na przykład brak specjalnej logiki biznesowej), ustaw kontroler preferencji jako
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Jeśli preferencja wymaga logiki biznesowej, ustaw kontroler preferencji na nową nazwę kontrolera preferencji.
- Upewnij się, że wszystkie preferencje zdefiniowały
- ( Jeśli jest to wymagane ) Utwórz kontroler preferencji w odpowiednim pakiecie, który rozszerza
PreferenceController
. W razie potrzeby zobacz dokument Javadoc. - Utwórz fragment, w którym
getPreferenceScreenResId
zwróci plik XML zdefiniowany w kroku 1. - Utwórz działanie w
CarSettingActivities
, które rozszerzaBaseCarSettingsActivity
, a następnie zaimplementujgetInitialFragment()
, zwracając fragment zdefiniowany w kroku 3. - Zaktualizuj plik
AndroidManifest.xml
, aby uwzględnić działanie zdefiniowane w kroku 4.
Przykład
Poniższy materiał ilustruje ten proces.
- Zdefiniuj plik XML o nazwie
demo_fragment.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>
- Dodaj klucze preferencji do
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>
- Dodaj klucz ekranu preferencji do
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
W przypadku pierwszej przykładowej preferencji użyj
DefaultRestrictionsPreferenceController
. W przypadku drugiej preferencji użyj niestandardowego kontrolera preferencji, który należy zdefiniować. W tym przykładzie możesz dostosować tę preferencję tylko do dostępnych administratorów. Aby to zrobić, zdefiniuj następujący kontroler niestandardowy: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; } }
- Aby utworzyć fragment, zastąp
getPreferenceScreenResId
: - Aby zachować nowy fragment, utwórz działanie w
CarSettingActivities
: - Zaktualizuj plik manifestu o nowe działanie:
- Nie jest bezpośrednio zaimplementowane w aplikacji CarSettings (np. poprzez wstrzykiwanie ustawienia zaimplementowanego przez producentów OEM).
- Powinien pojawić się w aplikacji CarSettings.
- Aby oznaczyć działanie jako wstrzyknięte ustawienie, dodaj do działania filtr intencji.
- Powiedz aplikacji CarSettings, do której kategorii należy. Kategoria jest stałą zdefiniowaną w
CategoryKey
i służy do wskazania, na którym poziomie CarSettings powinno pojawić się wstrzyknięte ustawienie. WewnątrzCategoryKey
udostępniamy zestaw kategorii, ale producenci OEM nie mają żadnych ograniczeń w zakresie definiowania własnych kategorii. - ( opcjonalnie ) Dodaj tekst podsumowania, gdy ustawienie jest wyświetlane:
<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>
Dodaj preferencję zamiaru zewnętrznego w Ustawieniach samochodu
Alternatywą dla wprowadzonych preferencji jest także możliwość wstawienia preferencji bezpośrednio w Ustawieniach samochodu, która będzie przeznaczona dla innej aplikacji. Można to zrobić, po prostu dodając preferencję do ekranu preferencji z akcją intencji, która prowadzi do aplikacji zewnętrznej. Podobnie jak inne preferencje w Ustawieniach samochodu, te preferencje mają te same dostępne atrybuty 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>
Dodaj wstrzykniętą preferencję
Wstrzyknięte preferencje zawierają zamiary prowadzące do działań zewnętrznych lub wewnętrznych. Na przykład element ustawień Google na stronie głównej Ustawień to wstrzyknięta preferencja. Wstrzyknięte preferencje są szczególnie przydatne, gdy spełniony jest którykolwiek z poniższych warunków. Ustawienie:
Aby skonfigurować działanie jako wstrzyknięte ustawienie:
Aby wprowadzone ustawienie pojawiło się na określonej stronie aplikacji CarSettings, dołącz następujący przykładowy kod do pliku XML, modyfikując zmienne tam, gdzie to konieczne:
<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>