Araç ayarları ekleme

Araba Ayarları'ndaki çoğu sayfa, SettingsFragment'yi genişleten bir dizi parça olarak uygulanır. Bu parçaların her biri CarSettingActivities'ta tanımlanan kendi etkinliğine sahiptir. Bu statik etkinlikler BaseCarSettingsActivity'ten uzatılır. Bu ayarlara ek olarak, CarSettings'te görünmesi için diğer sistem uygulamalarından tercihler ekleyebilirsiniz.

Araba ayarlarında yeni bir tercih ekleme

Yeni bir ayar eklemek için:

  1. XML dosyası tanımlama:
    1. Tüm tercihlerde android:key tanımlandığından emin olun. Anahtar listesi preference_keys.xml'te tutulur. Tercih anahtarları benzersiz olmalıdır.
    2. Arama dizine ekleme amacıyla, tercih ekranlarında da tanımlanmış bir android:key olmalıdır. Tercih ekranı anahtarlarının listesi preference_screen_keys.xml içinde tutulur. Tercih ekranı anahtarları da benzersiz olmalıdır.
    3. Tercih yalnızca statik bilgiler gösteriyorsa (ör. özel iş mantığı yoksa) tercih denetleyiciyi com.android.car.settings.common.DefaultRestrictionsPreferenceController olarak ayarlayın.
    4. Tercih için iş mantığı gerekiyorsa tercih denetleyicisini yeni bir tercih denetleyici adıyla ayarlayın.
  2. (Gerekirse) Tercih denetleyiciyi, PreferenceController'yi genişleten uygun pakette 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 içinde BaseCarSettingsActivity'u genişleten bir etkinlik oluşturun ve ardından 3. adımda tanımlanan parçayı döndürerek getInitialFragment()'yi uygulayın.
  5. AndroidManifest.xml öğesini 4. adımda tanımlanan etkinliği içerecek şekilde güncelleyin.

Örnek

Aşağıdaki materyalde bu süreç gösterilmektedir.

  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'e 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 alanı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. 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'te bir etkinlik oluşturun:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. Manifest 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>

    Araç Ayarları'nda harici intent tercihi ekleme

    Eklenmiş tercihlere alternatif olarak, doğrudan Araba Ayarları'na başka bir uygulamaya yönlendiren bir tercih eklemek de mümkündür. Bu, bir tercih ekranına harici bir uygulamaya yönlendiren bir intent işlemi içeren bir tercih ekleyerek yapılabilir. Araba Ayarları'ndaki diğer tercihler gibi bu tercihler de aynı XML özelliklerini kullanabilir.

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

    Enjekte edilen tercihler, harici veya dahili etkinliklere yönlendiren intent'ler içerir. Örneğin, Ayarlar ana sayfasındaki Google ayar öğesi, eklenmiş bir tercihtir. Eklenmiş tercihler özellikle aşağıdakilerden herhangi biri doğru olduğunda yararlıdır. Ayar:

    • CarSettings uygulamasına doğrudan uygulanmamalıdır (ör. OEM'ler tarafından uygulanan bir ayarın eklenmesi).
    • CarSettings uygulamasında görünür.

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

    1. Etkinliği enjekte edilen ayar olarak işaretlemek için etkinliğe bir intent filtresi ekleyin.
    2. CarSettings uygulamasına hangi kategoriye ait olduğunu bildirin. Kategori, CategoryKey içinde tanımlanan bir sabittir ve CarSettings'in hangi düzeyinde eklenmiş ayarın görüneceğini belirtmek için kullanılır. CategoryKey içinde bir dizi kategori sağlarız ancak OEM'lerin kendi kategorilerini tanımlaması için herhangi bir kısıtlama yoktur.
    3. (isteğe bağlı) Ayar gösterilirken özet metin 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ındaki belirli bir sayfada görünmesi için XML'e aşağıdaki örnek kodu ekleyin ve uygun durumlarda 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>