Sebagian besar halaman di Car Settings diimplementasikan sebagai rangkaian fragmen yang memperluas SettingsFragment
, dengan masing-masing halaman memiliki aktivitasnya sendiri yang ditentukan di CarSettingActivities
. Aktivitas statis ini diperluas dari BaseCarSettingsActivity
. Selain pengaturan ini, Anda dapat memasukkan preferensi dari aplikasi sistem lain untuk muncul di CarSettings.
Tambahkan preferensi baru di Pengaturan Mobil
Untuk menambahkan pengaturan baru:
- Tentukan file XML:
- Pastikan semua preferensi telah ditentukan
android:key
. Daftar kunci disimpan dipreference_keys.xml
. Kunci preferensi harus unik. - Untuk tujuan pengindeksan penelusuran, layar preferensi juga harus memiliki
android:key
yang ditentukan. Daftar tombol layar preferensi disimpan dipreference_screen_keys.xml
. Tombol layar preferensi juga harus unik. - Jika preferensi hanya menampilkan informasi statis (misalnya, tidak ada logika bisnis khusus), setel pengontrol preferensi sebagai
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Jika preferensi memerlukan logika bisnis, atur pengontrol preferensi dengan nama pengontrol preferensi baru.
- Pastikan semua preferensi telah ditentukan
- ( Jika diperlukan ) Buat pengontrol preferensi dalam paket yang sesuai, yang memperluas
PreferenceController
. Lihat Javadoc jika diperlukan. - Buat fragmen dengan
getPreferenceScreenResId
yang mengembalikan file XML yang ditentukan pada Langkah 1. - Buat aktivitas di
CarSettingActivities
yang memperluasBaseCarSettingsActivity
lalu implementasikangetInitialFragment()
, yang mengembalikan fragmen yang ditentukan pada Langkah 3. - Perbarui
AndroidManifest.xml
untuk menyertakan aktivitas yang ditentukan pada Langkah 4.
Contoh
Materi berikut menggambarkan proses ini.
- Tentukan file XML bernama
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>
- Tambahkan kunci preferensi ke
preference_keys
:<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>
- Tambahkan kunci layar preferensi ke
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Untuk contoh preferensi pertama, gunakan
DefaultRestrictionsPreferenceController
. Untuk preferensi kedua, gunakan pengontrol preferensi khusus, yang perlu ditentukan. Untuk contoh ini, Anda dapat menyesuaikan preferensi ini hanya untuk pengguna admin yang tersedia. Untuk melakukannya, tentukan pengontrol khusus berikut: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; } }
- Untuk membuat fragmen, ganti
getPreferenceScreenResId
: - Untuk menampung fragmen baru, buat aktivitas di
CarSettingActivities
: - Perbarui file manifes dengan aktivitas baru:
- Tidak diterapkan secara langsung di aplikasi CarSettings (seperti memasukkan pengaturan yang diterapkan oleh OEM).
- Akan muncul di aplikasi CarSettings.
- Untuk menandai aktivitas sebagai pengaturan yang dimasukkan, tambahkan filter maksud ke aktivitas.
- Beri tahu aplikasi CarSettings kategori mana yang termasuk. Kategori adalah sebuah konstanta, yang didefinisikan dalam
CategoryKey
, dan digunakan untuk menunjukkan di tingkat CarSettings mana pengaturan yang dimasukkan akan muncul. Kami menyediakan serangkaian kategori di dalamCategoryKey
, namun tidak ada batasan bagi OEM untuk menentukan kategori mereka sendiri. - ( opsional ) Tambahkan teks ringkasan saat pengaturan ditampilkan:
<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>
Tambahkan preferensi niat eksternal dalam Pengaturan Mobil
Sebagai alternatif dari preferensi yang dimasukkan, Anda juga dapat memasukkan preferensi langsung ke Pengaturan Mobil yang ditujukan ke aplikasi lain. Hal ini dapat dilakukan hanya dengan menambahkan preferensi ke layar preferensi dengan tindakan niat yang diselesaikan ke aplikasi eksternal. Seperti preferensi lain di Pengaturan Mobil, preferensi ini memiliki atribut XML yang sama.
<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>
Tambahkan preferensi yang disuntikkan
Preferensi yang dimasukkan berisi maksud yang mengarah ke aktivitas eksternal atau internal. Sebagai contoh, item pengaturan Google di halaman beranda Pengaturan adalah preferensi yang dimasukkan. Preferensi yang dimasukkan sangat berguna jika salah satu hal berikut ini benar. Pengaturan:
Untuk mengonfigurasi aktivitas sebagai pengaturan yang dimasukkan:
Agar pengaturan yang dimasukkan muncul pada halaman tertentu di aplikasi CarSettings, sertakan kode contoh berikut dalam XML, modifikasi variabel jika diperlukan:
<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>