Autoeinstellungen hinzufügen

Die meisten Seiten in den Autoeinstellungen sind Fragmente, die SettingsFragment, Jeder von ihnen hat ihre eigene Aktivität in CarSettingActivities. Diese statischen Aktivitäten gelten ab dem BaseCarSettingsActivity. Zusätzlich zu diesen Einstellungen können Sie Einstellungen aus anderen System-Apps hinzufügen, die in den Autoeinstellungen angezeigt werden.

Neue Einstellung in den Autoeinstellungen hinzufügen

So fügen Sie eine neue Einstellung hinzu:

  1. Definieren Sie eine XML-Datei: <ph type="x-smartling-placeholder">
      </ph>
    1. Achten Sie darauf, dass für alle Einstellungen „android:key“ definiert ist. Die Liste von Schlüsseln wird in preference_keys.xml verwaltet. Einstellungen Schlüssel müssen eindeutig sein.
    2. Für die Indexierung der Suche sollten auf den Bildschirmen für Einstellungen außerdem Eine definierte android:key. Die Liste der bevorzugten Bildschirmtasten wird in preference_screen_keys.xml verwaltet. Einstellung Bildschirmtasten müssen ebenfalls eindeutig sein.
    3. Wenn in der Einstellung nur statische Informationen angezeigt werden (z. B. keine spezielle Geschäftslogik), legen Sie den bevorzugten Controller als com.android.car.settings.common.DefaultRestrictionsPreferenceController
    4. Wenn für die Einstellung Geschäftslogik erforderlich ist, legen Sie die Einstellung fest. Controller mit einem neuen bevorzugten Controller-Namen.
  2. (Falls erforderlich) Erstellen Sie den bevorzugten Controller im entsprechenden Bereich -Paket, das PreferenceController erweitert. Weitere Informationen finden Sie in der Javadoc.
  3. Erstellt ein Fragment, bei dem getPreferenceScreenResId den Wert XML-Datei, die in Schritt 1 definiert wurde.
  4. Aktivität in CarSettingActivities erstellen die sich BaseCarSettingsActivity und dann getInitialFragment() implementieren, wodurch das Fragment zurückgegeben wird wie in Schritt 3 definiert.
  5. Aktualisieren Sie AndroidManifest.xml, um die in Schritt 4 definierte Aktivität aufzunehmen.

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 Einstellungsschlü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 preference_screen_keys.xml die bevorzugte Bildschirmtaste hinzu:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    Verwenden Sie für die erste Beispieleinstellung DefaultRestrictionsPreferenceController. Verwenden Sie für die zweite Präferenz einen benutzerdefinierten Controller, der definiert werden muss. In diesem Beispiel können Sie diese Einstellung nur für verfügbare Administratoren 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. Überschreiben Sie getPreferenceScreenResId, um ein Fragment zu erstellen:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Erstellen Sie eine Aktivität in CarSettingActivities, um das neue Fragment zu speichern:
  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>
    

    Externe Intent-Einstellung in den Autoeinstellungen hinzufügen

    Als Alternative zu eingefügten Präferenzen ist es auch möglich, können Sie direkt in den Autoeinstellungen eine Einstellung eine andere App. Dazu können Sie einfach eine Einstellung hinzufügen, mit einer Intent-Aktion, die zu einem externen Genau wie andere Einstellungen in den Autoeinstellungen werden auch diese Einstellungen dieselben XML-Attribute zur Verfügung stehen.

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

    Injizierte Einstellung hinzufügen

    Injizierte Präferenzen enthalten Intents, die zu externen oder internen Zwecken führen Aktivitäten. Beispiel: Die Einstellung Google in den Einstellungen „Homepage“ ist eine eingefügte Präferenz. Eingefügte Präferenzen sind besonders ist nützlich, wenn einer der folgenden Punkte zutrifft. Die Einstellung:

    • nicht direkt in der CarSettings-App implementiert ist (z. B. das Einfügen einer Einstellung, die von OEMs implementiert wurde).
    • Sollte in der App „CarSettings“ angezeigt werden.

    So konfigurieren Sie eine Aktivität als eingefügte Einstellung:

    1. Fügen Sie einen Intent-Filter hinzu, um die Aktivität als eingefügte Einstellung zu markieren. der Aktivität.
    2. Teilen Sie der CarSettings App mit, zu welcher Kategorie sie gehört. Die Kategorie ist ein Konstante, definiert in CategoryKey, und gibt an, auf welcher Ebene von CarSettings die eingefügte Einstellung angezeigt werden soll. Wir stellen dort eine Reihe von Kategorien zur Verfügung, CategoryKey, aber es gibt keine Einschränkungen für OEMs. eigenen Kategorien zuordnen.
    3. Optional: Geben Sie eine Zusammenfassung ein, 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 im App „CarSettings“ den folgenden Beispielcode in die XML-Datei ein, indem Sie Variablen verfügbar sind:

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