Większość stron w Ustawieniach samochodu jest zaimplementowana jako seria
fragmenty, które rozciągają się SettingsFragment
,
a każda z nich ma własną aktywność zdefiniowaną w narzędziu CarSettingActivities
.
Okres tych aktywności statycznych został przedłużony od BaseCarSettingsActivity
.
Oprócz tych ustawień możesz też wstrzykiwać preferencje z innych aplikacji systemowych, aby
pojawią się
w Ustawieniach samochodu.
Dodaj nowe ustawienie w Ustawieniach samochodu
Aby dodać nowe ustawienie:
- Zdefiniuj plik XML:
- Upewnij się, że we wszystkich preferencjach jest zdefiniowany
android:key
. Lista kluczy jest utrzymanych w regioniepreference_keys.xml
. Ustawienia muszą być unikalne. - Na potrzeby indeksowania wyników wyszukiwania ekrany preferencji powinny też mieć
zdefiniowaną wartość
android:key
. Lista klawiszy na ekranie preferencji jest obsługiwane w regioniepreference_screen_keys.xml
. Preferencje Klawisze ekranu również powinny być unikalne. - Jeśli ustawienie wyświetla tylko informacje statyczne (np.
bez specjalnej logiki biznesowej), ustaw kontroler preferencji jako
com.android.car.settings.common.DefaultRestrictionsPreferenceController
- Jeśli preferencja wymaga logiki biznesowej, ustaw ją z nową nazwą kontrolera preferencji.
- Upewnij się, że we wszystkich preferencjach jest zdefiniowany
- (W razie potrzeby) Utwórz kontroler preferencji w odpowiednich
pakiet, który obejmuje
PreferenceController
. W razie potrzeby zajrzyj do pliku Javadoc. - Utwórz fragment, w którym
getPreferenceScreenResId
zwraca wartość plik XML zdefiniowany w kroku 1. - Utwórz aktywność w:
CarSettingActivities
która obejmujeBaseCarSettingsActivity
a następnie implementujęgetInitialFragment()
, zwracając fragment zdefiniowane w kroku 3. - Zaktualizuj pole
AndroidManifest.xml
, aby uwzględnić aktywność zdefiniowaną w kroku 4.
Przykład
Następujący 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 klawisz ekranu preferencji do aplikacji
preference_screen_keys.xml
:<resources>
[...]
<string name="psk_demo" translatable="false">demo_screen</string>
</resources>W pierwszym przykładzie należy użyć właściwości
DefaultRestrictionsPreferenceController
. W przypadku drugiej preferencji użyj niestandardowego kontrolera preferencji, który musi być zdefiniowany. W tym przykładzie możesz zmienić to ustawienie tak, aby obejmowały tylko dostępnych administratorów. Aby to zrobić, zdefiniuj ten 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 zatrzymać nowy fragment, utwórz aktywność w obszarze
CarSettingActivities
: - Dodaj do pliku manifestu nową aktywność:
- nie jest zaimplementowany bezpośrednio w aplikacji CarSettings (np. wstrzykiwanie ustawienia stosowanego przez producentów OEM).
- Opcja powinna pojawić się w aplikacji CarSettings.
- Aby oznaczyć aktywność jako wstrzyknięte ustawienie, dodaj filtr intencji do aktywność.
- Poinformuj aplikację CarSettings, do której kategorii należy. Kategoria to
stała, zdefiniowana w zasadzie
CategoryKey
, i służy do wskazania, na jakim poziomie CarSettings wprowadzono ustawienie. powinny pojawić się w etykiecie. Udostępniamy zestaw kategorii w ramachCategoryKey
, ale producenci OEM nie muszą określać żadnych ograniczeń. do tworzenia własnych kategorii. - (Opcjonalnie) Dodaj tekst podsumowania po wyświetleniu ustawienia:
<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ę zewnętrzną w ustawieniach samochodu
Zamiast preferencji wstrzykiwanych możesz również użyć wstawić preferencję bezpośrednio w ustawieniach samochodu, innej aplikacji. Można to zrobić, dodając preferencje na ekran preferencji z działaniem intencji, które prowadzi do . Tak samo jak w przypadku innych ustawień samochodu, mają te same 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 preferencję
Wstrzyknięte preferencje zawierają intencje prowadzące do zewnętrznych lub wewnętrznych aktywności. Przykładem może być element ustawienia Google w sekcji Ustawienia. strona główna jest preferencją wstrzykiwaną. Wstrzyknięte preferencje są szczególnie ważne przydatne, kiedy spełniony jest dowolny z tych warunków. Ustawienie:
Aby skonfigurować działanie jako ustawienie wstrzykiwane:
Aby wstrzyknięte ustawienie pojawiało się na określonej stronie w CarSettings, umieść w kodzie XML poniższy przykładowy kod, modyfikując zmiennych (w stosownych przypadkach):
<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>