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:
- Bir XML dosyası tanımlayın:
- Tüm tercihlerin
android:key
tanımlı olduğundan emin olun. Anahtarların listesipreference_keys.xml
dosyasında tutulur. Tercih tuşları benzersiz olmalıdır. - 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. - 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. - Tercih iş mantığı gerektiriyorsa tercih denetleyicisini yeni bir tercih denetleyicisi adıyla ayarlayın.
- Tüm tercihlerin
- ( Gerekirse )
PreferenceController
genişleten uygun pakette tercih denetleyicisini 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
BaseCarSettingsActivity
genişleten bir etkinlik oluşturun ve ardındangetInitialFragment()
öğesini uygulayarak Adım 3'te tanımlanan parçayı döndürün. - 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.
-
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
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
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; } }
- Bir parça oluşturmak için
getPreferenceScreenResId
değerini geçersiz kılın: - Yeni parçayı tutmak için
CarSettingActivities
bir aktivite oluşturun: - Bildirim dosyasını yeni etkinlikle güncelleyin:
- Doğrudan CarSettings uygulamasında uygulanmaz (örneğin, OEM'ler tarafından uygulanan bir ayarın enjekte edilmesi).
- CarSettings uygulamasında görünmelidir.
- Etkinliği enjekte edilmiş ayar olarak işaretlemek için etkinliğe bir amaç filtresi ekleyin.
- 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. - ( 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>
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>
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:
Bir etkinliği enjekte edilen ayar olarak yapılandırmak için:
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>