Araç Ayarları Ekle

Araba Ayarları'ndaki çoğu sayfa, SettingsFragment genişleten bir dizi parça olarak uygulanır ve her biri CarSettingActivities tanımlanan kendi etkinliğine sahiptir. Bu statik aktiviteler BaseCarSettingsActivity genişletilmiştir. Bu ayarlara ek olarak diğer sistem uygulamalarından tercihleri ​​CarSettings'te görünecek şekilde enjekte edebilirsiniz.

Araba Ayarlarına yeni bir tercih ekleyin

Yeni bir ayar eklemek için:

  1. Bir XML dosyası tanımlayın:
    1. Tüm tercihlerin android:key tanımlı olduğundan emin olun. Anahtarların listesi preference_keys.xml dosyasında tutulur. Tercih tuşları benzersiz olmalıdır.
    2. Arama indeksleme amacıyla, tercih ekranlarının da tanımlanmış bir android:key olması gerekir. Tercih ekranı tuşlarının listesi, preference_screen_keys.xml dosyasında tutulur. Tercih ekranı tuşları da benzersiz olmalıdır.
    3. Tercih yalnızca statik bilgileri görüntülüyorsa (örneğin, özel iş mantığı yoksa), tercih denetleyicisini com.android.car.settings.common.DefaultRestrictionsPreferenceController olarak ayarlayın.
    4. Tercih iş mantığı gerektiriyorsa tercih denetleyicisini yeni bir tercih denetleyicisi adıyla ayarlayın.
  2. ( Gerekirse ) PreferenceController genişleten uygun pakette tercih denetleyicisini oluşturun. Gerekirse Javadoc'a bakın.
  3. 1. Adımda tanımlanan XML dosyasını döndüren getPreferenceScreenResId ile bir parça oluşturun.
  4. CarSettingActivities BaseCarSettingsActivity genişleten bir etkinlik oluşturun ve ardından getInitialFragment() öğesini uygulayarak Adım 3'te tanımlanan parçayı döndürün.
  5. 4. Adımda tanımlanan etkinliği dahil etmek için AndroidManifest.xml dosyasını güncelleyin.

Örnek

Aşağıdaki materyal bu süreci göstermektedir.

  1. demo_fragment.xml adlı bir XML dosyası tanımlayın:
    <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. Tercih anahtarlarını preference_keys ekleyin:
    <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. Tercih ekranı anahtarını preference_screen_keys.xml dosyasına ekleyin:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    İlk örnek tercih için DefaultRestrictionsPreferenceController kullanın. İkinci tercih için tanımlanması gereken özel bir tercih denetleyicisi kullanın. Bu örnekte, bu tercihi yalnızca mevcut yönetici kullanıcılar için özelleştirebilirsiniz. Bunu yapmak için aşağıdaki özel denetleyiciyi tanımlayın:

    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. Bir parça oluşturmak için getPreferenceScreenResId değerini geçersiz kılın:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Yeni parçayı tutmak için CarSettingActivities bir aktivite oluşturun:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Bildirim dosyasını yeni etkinlikle güncelleyin:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Araba Ayarlarına harici amaç tercihi ekleyin

    Eklenen tercihlere alternatif olarak, başka bir uygulamaya yönelik bir tercihi doğrudan Araç Ayarlarına eklemek de mümkündür. Bu, harici bir uygulamaya çözümlenen bir niyet eylemiyle bir tercih ekranına basitçe bir tercih eklenerek yapılabilir. Araç Ayarlarındaki diğer tercihler gibi, bu tercihler de aynı XML niteliklerine sahiptir.

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

    Enjekte edilen bir tercih ekleyin

    Eklenen tercihler, harici veya dahili faaliyetlere yol açan niyetleri içerir. Örnek olarak Ayarlar ana sayfasındaki Google ayar öğesi enjekte edilmiş bir tercihtir. Aşağıdakilerden herhangi biri doğru olduğunda enjekte edilen tercihler özellikle faydalıdır. Ayar:

    • Doğrudan CarSettings uygulamasında uygulanmaz (örneğin, OEM'ler tarafından uygulanan bir ayarın enjekte edilmesi).
    • CarSettings uygulamasında görünmelidir.

    Bir etkinliği enjekte edilen ayar olarak yapılandırmak için:

    1. Etkinliği enjekte edilmiş ayar olarak işaretlemek için etkinliğe bir amaç filtresi ekleyin.
    2. CarSettings uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori, CategoryKey tanımlanan bir sabittir ve eklenen ayarın CarSettings'in hangi düzeyinde görünmesi gerektiğini belirtmek için kullanılır. CategoryKey içinde bir dizi kategori sağlıyoruz, ancak OEM'lerin kendi kategorilerini tanımlamaları için herhangi bir kısıtlama yoktur.
    3. ( isteğe bağlı ) Ayar görüntülendiğinde özet metni ekleyin:
      <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>
      

    Enjekte edilen ayarın CarSettings uygulamasında belirli bir sayfada görünmesini sağlamak için XML'e aşağıdaki örnek kodu ekleyin ve uygun yerlerde değişkenleri değiştirin:

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