Fahrzeugeinstellungen hinzufügen

Die meisten Seiten in Car Settings werden als eine Reihe von Fragmenten implementiert, die SettingsFragment erweitern, wobei jede von ihnen über eine eigene Aktivität verfügt, die in CarSettingActivities definiert ist. Diese statischen Aktivitäten werden von BaseCarSettingsActivity erweitert. Zusätzlich zu diesen Einstellungen können Sie Einstellungen von anderen System-Apps einfügen, die in CarSettings angezeigt werden.

Fügen Sie in den Fahrzeugeinstellungen eine neue Einstellung hinzu

So fügen Sie eine neue Einstellung hinzu:

  1. Definieren Sie eine XML-Datei:
    1. Stellen Sie sicher, dass in allen Einstellungen android:key definiert ist. Die Liste der Schlüssel wird in preference_keys.xml verwaltet. Präferenzschlüssel sollten eindeutig sein.
    2. Für Suchindizierungszwecke sollten Einstellungsbildschirme auch über einen definierten android:key verfügen. Die Liste der Präferenzbildschirmtasten wird in der Datei preference_screen_keys.xml verwaltet. Die Tasten für den Präferenzbildschirm sollten ebenfalls eindeutig sein.
    3. Wenn die Einstellung nur statische Informationen anzeigt (z. B. keine spezielle Geschäftslogik), legen Sie den Einstellungscontroller auf com.android.car.settings.common.DefaultRestrictionsPreferenceController fest.
    4. Wenn die Präferenz Geschäftslogik erfordert, legen Sie den Präferenz-Controller mit einem neuen Namen für den Präferenz-Controller fest.
  2. ( Falls erforderlich ) Erstellen Sie den Präferenzcontroller im entsprechenden Paket, der PreferenceController erweitert. Sehen Sie sich bei Bedarf die Javadoc an.
  3. Erstellen Sie ein Fragment mit getPreferenceScreenResId , das die in Schritt 1 definierte XML-Datei zurückgibt.
  4. Erstellen Sie in CarSettingActivities eine Aktivität, die BaseCarSettingsActivity erweitert, und implementieren Sie dann getInitialFragment() , um das in Schritt 3 definierte Fragment zurückzugeben.
  5. Aktualisieren Sie AndroidManifest.xml , um die in Schritt 4 definierte Aktivität einzuschließen.

Beispiel

Das folgende Material veranschaulicht diesen Prozess.

  1. Definieren Sie eine XML-Datei mit dem Namen 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>
    
  2. Fügen Sie die Präferenzschlüssel zu preference_keys hinzu:
    <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>
    
  3. Fügen Sie den Präferenzbildschirmschlüssel zu preference_screen_keys.xml hinzu:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    Verwenden Sie für die erste Beispielpräferenz DefaultRestrictionsPreferenceController . Verwenden Sie für die zweite Präferenz einen benutzerdefinierten Präferenz-Controller, der definiert werden muss. In diesem Beispiel können Sie diese Einstellung nur für verfügbare Administratorbenutzer anpassen. Definieren Sie dazu den folgenden benutzerdefinierten Controller:

    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;
        }
    }
    
  4. Um ein Fragment zu erstellen, überschreiben Sie getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Um das neue Fragment zu speichern, erstellen Sie eine Aktivität in CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Aktualisieren Sie die Manifestdatei mit der neuen Aktivität:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Fügen Sie in den Fahrzeugeinstellungen eine externe Absichtspräferenz hinzu

    Als Alternative zu den eingefügten Präferenzen ist es auch möglich, eine Präferenz direkt in die Fahrzeugeinstellungen einzufügen, die in eine andere App übertragen werden soll. Dies kann durch einfaches Hinzufügen einer Präferenz zu einem Präferenzbildschirm mit einer Absichtsaktion erreicht werden, die in eine externe App aufgelöst wird. Wie für andere Einstellungen in den Fahrzeugeinstellungen stehen diesen Einstellungen dieselben XML-Attribute zur Verfügung.

    <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>
    

    Fügen Sie eine injizierte Präferenz hinzu

    Injizierte Präferenzen enthalten Absichten, die zu externen oder internen Aktivitäten führen. Beispielsweise ist das Google- Einstellungselement auf der Startseite „Einstellungen“ eine injizierte Einstellung. Injizierte Präferenzen sind besonders nützlich, wenn eine der folgenden Aussagen zutrifft. Die Einstellung:

    • Wird nicht direkt in der CarSettings-App implementiert (z. B. durch Einfügen einer von OEMs implementierten Einstellung).
    • Sollte in der CarSettings-App erscheinen.

    So konfigurieren Sie eine Aktivität als injizierte Einstellung:

    1. Um die Aktivität als injizierte Einstellung zu markieren, fügen Sie der Aktivität einen Absichtsfilter hinzu.
    2. Teilen Sie der CarSettings-App mit, zu welcher Kategorie sie gehört. Die Kategorie ist eine in CategoryKey definierte Konstante und wird verwendet, um anzugeben, auf welcher Ebene von CarSettings die eingefügte Einstellung angezeigt werden soll. Wir stellen eine Reihe von Kategorien innerhalb CategoryKey bereit, es gibt jedoch keine Einschränkungen für OEMs, ihre eigenen Kategorien zu definieren.
    3. ( optional ) Fügen Sie einen zusammenfassenden Text hinzu, wenn die Einstellung angezeigt wird:
      <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>
      

    Damit die eingefügte Einstellung auf einer bestimmten Seite in der CarSettings-App angezeigt wird, fügen Sie den folgenden Beispielcode in die XML-Datei ein und ändern Sie gegebenenfalls die Variablen:

    <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>