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:
- XML dosyası tanımlama:
- Tüm tercihlerde
android:key
tanımlandığından emin olun. Anahtar listesipreference_keys.xml
'te tutulur. Tercih anahtarları benzersiz olmalıdır. - Arama dizine ekleme amacıyla, tercih ekranlarında da tanımlanmış bir
android:key
olmalıdır. Tercih ekranı anahtarlarının listesipreference_screen_keys.xml
içinde tutulur. Tercih ekranı anahtarları da benzersiz olmalıdır. - Tercih yalnızca statik bilgiler gösteriyorsa (ör. özel iş mantığı yoksa) tercih denetleyiciyi
com.android.car.settings.common.DefaultRestrictionsPreferenceController
olarak ayarlayın. - Tercih için iş mantığı gerekiyorsa tercih denetleyicisini yeni bir tercih denetleyici adıyla ayarlayın.
- Tüm tercihlerde
- (Gerekirse) Tercih denetleyiciyi,
PreferenceController
'yi genişleten uygun pakette oluşturun. Gerekirse Javadoc'a bakın. - 1. adımda tanımlanan XML dosyasını döndüren
getPreferenceScreenResId
ile bir parça oluşturun. CarSettingActivities
içindeBaseCarSettingsActivity
'u genişleten bir etkinlik oluşturun ve ardından 3. adımda tanımlanan parçayı döndürerekgetInitialFragment()
'yi uygulayın.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.
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>
- 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>
- 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; } }
- Parça oluşturmak için
getPreferenceScreenResId
değerini geçersiz kılın: - Yeni parçayı tutmak için
CarSettingActivities
'te bir etkinlik oluşturun: - Manifest dosyasını yeni etkinlikle güncelleyin:
- 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.
- Etkinliği enjekte edilen ayar olarak işaretlemek için etkinliğe bir intent filtresi ekleyin.
- 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. - (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>
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>
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:
Bir etkinliği enjekte edilen ayar olarak yapılandırmak için:
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>