Menambahkan Pengaturan Mobil

Sebagian besar halaman di Pengaturan Mobil diimplementasikan sebagai rangkaian fragmen yang memperluas SettingsFragment , dengan masing-masing 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 Pengaturan Mobil.

Menambahkan Preferensi Baru di Pengaturan Mobil

Untuk menambahkan setelan baru:

  1. Tentukan file XML:
    1. Pastikan semua preferensi telah ditentukan android:key . Daftar kunci dipertahankan di preference_keys.xml . Kunci preferensi harus unik.
    2. Untuk tujuan pengindeksan pencarian, layar preferensi juga harus memiliki android:key yang ditentukan. Daftar kunci layar preferensi dipertahankan di preference_screen_keys.xml . Tombol layar preferensi juga harus unik.
    3. Jika preferensi hanya menampilkan informasi statis (misalnya, tidak ada logika bisnis khusus), setel pengontrol preferensi sebagai com.android.car.settings.common.DefaultRestrictionsPreferenceController .
    4. Jika preferensi memerlukan logika bisnis, atur pengontrol preferensi dengan nama pengontrol preferensi baru.
  2. ( Jika diperlukan ) Buat pengontrol preferensi dalam paket yang sesuai, yang memperluas PreferenceController . Lihat Javadoc jika perlu.
  3. Buat fragmen dengan getPreferenceScreenResId mengembalikan file XML yang ditentukan pada Langkah 1.
  4. Buat aktivitas di CarSettingActivities yang memperluas BaseCarSettingsActivity dan kemudian mengimplementasikan getInitialFragment() , mengembalikan fragmen yang ditentukan di Langkah 3.
  5. Perbarui AndroidManifest.xml untuk menyertakan aktivitas yang ditentukan di Langkah 4.

Contoh

Materi berikut mengilustrasikan proses ini.

  1. Tentukan file XML bernama demo_fragment.xml : l10n
    <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. 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>
    
  3. Tambahkan kunci layar preferensi ke preference_screen_keys.xml :
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>
    

    Untuk preferensi contoh 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 kustom 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;
        }
    }
    
  4. Untuk membuat fragmen, timpa getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Untuk menyimpan fragmen baru, buat aktivitas di CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Perbarui file manifes dengan aktivitas baru:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>
    

    Menambahkan Preferensi Intent Eksternal dalam Pengaturan Mobil

    Sebagai alternatif untuk preferensi yang disuntikkan, juga dimungkinkan untuk menyisipkan preferensi langsung ke pengaturan mobil yang mengarah ke aplikasi lain. Ini dapat dilakukan hanya dengan menambahkan preferensi ke layar preferensi dengan tindakan maksud yang diselesaikan ke aplikasi eksternal. Seperti preferensi lain dalam pengaturan mobil, preferensi ini memiliki atribut XML yang sama yang tersedia untuk mereka.

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

    Menambahkan Preferensi yang Disuntikkan

    Preferensi yang disuntikkan berisi maksud yang mengarah ke Aktivitas eksternal atau internal. Sebagai contoh, item pengaturan Google di halaman beranda Pengaturan adalah preferensi yang disuntikkan. Preferensi yang disuntikkan sangat berguna ketika salah satu dari berikut ini benar. Pengaturan:

    • Tidak langsung diterapkan di aplikasi CarSettings (seperti menyuntikkan pengaturan yang diterapkan oleh OEM).
    • Akan muncul di aplikasi CarSettings.

    Untuk mengonfigurasi Aktivitas sebagai pengaturan yang disuntikkan:

    1. Untuk menandai aktivitas sebagai setelan yang disuntikkan, tambahkan filter maksud ke aktivitas.
    2. Beri tahu aplikasi CarSettings termasuk dalam kategori mana. Kategorinya adalah konstanta, yang ditentukan dalam CategoryKey , dan digunakan untuk menunjukkan di level mana CarSettings yang diinjeksi akan muncul. Kami menyediakan serangkaian kategori di dalam CategoryKey , tetapi tidak ada batasan bagi OEM untuk menentukan kategorinya sendiri.
    3. ( 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>
      

    Agar pengaturan yang disuntikkan muncul pada halaman tertentu di aplikasi CarSettings, sertakan kode contoh berikut dalam XML, ubah variabel jika perlu:

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