Tambahkan Setelan Mobil

Sebagian besar halaman di Setelan Mobil diimplementasikan sebagai serangkaian fragmen yang memperluas SettingsFragment, dan masing-masing memiliki aktivitasnya sendiri yang ditentukan di CarSettingActivities. Aktivitas statis ini diperluas dari BaseCarSettingsActivity. Selain setelan ini, Anda bisa memasukkan preferensi dari aplikasi sistem lain ke muncul di CarSettings.

Menambahkan preferensi baru di Setelan Mobil

Untuk menambahkan setelan baru:

  1. Menentukan file XML:
    1. Pastikan semua preferensi telah menentukan android:key. Daftar kunci dipertahankan di preference_keys.xml. Preferensi kunci harus unik.
    2. Untuk tujuan pengindeksan penelusuran, layar preferensi juga harus memiliki android:key yang telah ditentukan. Daftar tombol layar preferensi dikelola di preference_screen_keys.xml. Preferensi tombol layar 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, tetapkan preferensi dengan nama pengontrol preferensi baru.
  2. (Jika diperlukan) Buat pengontrol preferensi di , yang memperluas PreferenceController. Lihat Javadoc jika diperlukan.
  3. Buat fragmen dengan getPreferenceScreenResId yang menampilkan File XML yang ditentukan di Langkah 1.
  4. Buat aktivitas di CarSettingActivities yang memperluas BaseCarSettingsActivity lalu mengimplementasikan getInitialFragment(), yang menampilkan fragmen yang ditentukan dalam Langkah 3.
  5. Update AndroidManifest.xml untuk menyertakan aktivitas yang ditentukan di Langkah 4.

Contoh

Materi berikut menggambarkan proses ini.

  1. 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>
    
  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 contoh preferensi pertama, gunakan DefaultRestrictionsPreferenceController. Untuk preferensi kedua, gunakan pengontrol preferensi kustom, yang perlu ditentukan. Untuk contoh ini, Anda dapat menyesuaikan preferensi ini untuk pengguna admin yang tersedia saja. 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, ganti 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. Update 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 Setelan Mobil

    Sebagai alternatif dari preferensi yang dimasukkan, kita juga bisa melakukan memasukkan preferensi langsung ke Setelan Mobil yang ditujukan ke aplikasi lain. Hal ini dapat dilakukan hanya dengan menambahkan preferensi ke layar preferensi dengan tindakan intent yang di-resolve menjadi . Seperti preferensi lainnya di Setelan 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>
    

    Menambahkan preferensi yang dimasukkan

    Preferensi yang dimasukkan berisi intent yang mengarah ke eksternal atau internal aktivitas Anda. Sebagai contoh, item setelan Google di Setelan beranda adalah preferensi yang dimasukkan. Preferensi yang diinjeksikan sangat berguna jika salah satu kondisi berikut terpenuhi. Setelan:

    • Tidak diimplementasikan langsung di aplikasi CarSettings (seperti memasukkan setelan yang diterapkan oleh OEM).
    • Akan muncul di aplikasi CarSettings.

    Untuk mengonfigurasi aktivitas sebagai setelan yang dimasukkan:

    1. Untuk menandai aktivitas sebagai setelan yang dimasukkan, tambahkan filter intent ke melakukan aktivitas tersebut.
    2. Beri tahu aplikasi CarSettings kategorinya. Kategori ini adalah , yang ditentukan dalam CategoryKey, dan digunakan untuk menunjukkan pada tingkat CarSettings setelan yang dimasukkan seharusnya muncul. Kami menyediakan serangkaian kategori di dalam CategoryKey, tetapi tidak ada batasan bagi OEM untuk menentukan kategori mereka sendiri.
    3. (opsional) Tambahkan teks ringkasan saat setelan 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 setelan yang dimasukkan muncul di halaman tertentu dalam Aplikasi CarSettings, sertakan kode contoh berikut dalam XML, dengan memodifikasi variabel jika sesuai:

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