Home | History | Annotate | Download | only in ui
      1 page.title=Pengaturan
      2 page.tags=preference,preferenceactivity,preferencefragment
      3 
      4 @jd:body
      5 
      6 
      7 <div id="qv-wrapper">
      8 <div id="qv">
      9 
     10 <h2>Dalam dokumen ini</h2>
     11 <ol>
     12   <li><a href="#Overview">Ikhtisar</a>
     13     <ol>
     14       <li><a href="#SettingTypes">Preferensi</a></li>
     15     </ol>
     16   </li>
     17   <li><a href="#DefiningPrefs">Mendefinisikan Preferensi dalam XML</a>
     18     <ol>
     19       <li><a href="#Groups">Membuat grup pengaturan</a></li>
     20       <li><a href="#Intents">Menggunakan intent</a></li>
     21     </ol>
     22   </li>
     23   <li><a href="#Activity">Membuat Aktivitas Preferensi</a></li>
     24   <li><a href="#Fragment">Menggunakan Fragmen Preferensi</a></li>
     25   <li><a href="#Defaults">Mengatur Nilai Default</a></li>
     26   <li><a href="#PreferenceHeaders">Menggunakan Header Preferensi</a>
     27     <ol>
     28       <li><a href="#CreateHeaders">Membuat file header</a></li>
     29       <li><a href="#DisplayHeaders">Menampilkan header</a></li>
     30       <li><a href="#BackCompatHeaders">Mendukung versi yang lebih lama dengan header preferensi</a></li>
     31     </ol>
     32   </li>
     33   <li><a href="#ReadingPrefs">Preferensi Membaca</a>
     34     <ol>
     35       <li><a href="#Listening">Mendengarkan perubahan preferensi</a></li>
     36     </ol>
     37   </li>
     38   <li><a href="#NetworkUsage">Mengelola Penggunaan Jaringan</a></li>
     39   <li><a href="#Custom">Membangun Preferensi Custom</a>
     40     <ol>
     41       <li><a href="#CustomSelected">Menetapkan antarmuka pengguna</a></li>
     42       <li><a href="#CustomSave">Menyimpan nilai pengaturan</a></li>
     43       <li><a href="#CustomInitialize">Menginisialisasi nilai saat ini</a></li>
     44       <li><a href="#CustomDefault">Menyediakan nilai default</a></li>
     45       <li><a href="#CustomSaveState">Menyimpan dan memulihkan status Preferensi</a></li>
     46     </ol>
     47   </li>
     48 </ol>
     49 
     50 <h2>Kelas-kelas utama</h2>
     51 <ol>
     52   <li>{@link android.preference.Preference}</li>
     53   <li>{@link android.preference.PreferenceActivity}</li>
     54   <li>{@link android.preference.PreferenceFragment}</li>
     55 </ol>
     56 
     57 
     58 <h2>Lihat juga</h2>
     59 <ol>
     60   <li><a href="{@docRoot}design/patterns/settings.html">Panduan desain pengaturan</a></li>
     61 </ol>
     62 </div>
     63 </div>
     64 
     65 
     66 
     67 
     68 <p>Aplikasi sering kali menyertakan pengaturan yang memungkinkan pengguna memodifikasi fitur dan perilaku aplikasi. Misalnya,
     69 beberapa aplikasi memungkinkan pengguna untuk menetapkan apakah pemberitahuan diaktifkan atau menetapkan seberapa sering
     70 aplikasi menyinkronkan data dengan cloud.</p>
     71 
     72 <p>Jika ingin menyediakan pengaturan untuk aplikasi, Anda harus menggunakan
     73 API Android {@link android.preference.Preference} untuk membangun antarmuka yang konsisten dengan
     74 pengalaman pengguna di aplikasi Android yang lain (termasuk pengaturan sistem). Dokumen ini menjelaskan
     75 cara membangun pengaturan aplikasi Anda menggunakan API {@link android.preference.Preference}.</p>
     76 
     77 <div class="note design">
     78 <p><strong>Desain Pengaturan</strong></p>
     79   <p>Untuk informasi tentang cara mendesain pengaturan Anda, bacalah panduan desain <a href="{@docRoot}design/patterns/settings.html">Pengaturan</a>.</p>
     80 </div>
     81 
     82 
     83 <img src="{@docRoot}images/ui/settings/settings.png" alt="" width="435" />
     84 <p class="img-caption"><strong>Gambar 1.</strong> Cuplikan layar dari pengaturan
     85 aplikasi Messaging Android. Memilih item yang didefinisikan oleh {@link android.preference.Preference}
     86 akan membuka antarmuka untuk mengubah pengaturan.</p>
     87 
     88 
     89 
     90 
     91 <h2 id="Overview">Ikhtisar</h2>
     92 
     93 <p>Sebagai ganti menggunakan objek {@link android.view.View} untuk membangun antarmuka pengguna, pengaturan
     94 dibangun menggunakan berbagai subkelas dari kelas {@link android.preference.Preference} yang Anda
     95 deklarasikan dalam file XML.</p>
     96 
     97 <p>Objek {@link android.preference.Preference} adalah blok pembangun untuk pengaturan
     98 tunggal. Setiap {@link android.preference.Preference} muncul sebagai item dalam daftar dan menyediakan UI
     99 yang sesuai bagi pengguna untuk memodifikasi pengaturan. Misalnya, {@link
    100 android.preference.CheckBoxPreference} membuat item daftar yang menampilkan kotak cek, dan {@link
    101 android.preference.ListPreference} membuat item yang membuka dialog berisi daftar pilihan.</p>
    102 
    103 <p>Setiap {@link android.preference.Preference} yang Anda tambahkan memiliki pasangan nilai-kunci yang sesuai yang
    104 digunakan sistem untuk menyimpan pengaturan dalam file {@link android.content.SharedPreferences}
    105 default untuk pengaturan aplikasi Anda. Bila pengguna mengubah pengaturan, sistem akan memperbarui nilai
    106 yang bersangkutan dalam file {@link android.content.SharedPreferences} untuk Anda. Satu-satunya saat di mana Anda harus
    107 berinteraksi langsung dengan file {@link android.content.SharedPreferences} yang terkait adalah bila Anda
    108 perlu membaca nilai untuk menentukan perilaku aplikasi berdasarkan pengaturan pengguna.</p>
    109 
    110 <p>Nilai yang tersimpan di {@link android.content.SharedPreferences} untuk setiap pengaturan bisa berupa
    111 tipe data berikut:</p>
    112 
    113 <ul>
    114   <li>Boolean</li>
    115   <li>Float</li>
    116   <li>Int</li>
    117   <li>Long</li>
    118   <li>String</li>
    119   <li>String {@link java.util.Set}</li>
    120 </ul>
    121 
    122 <p>Oleh karena UI pengaturan aplikasi Anda dibangun menggunakan objek {@link android.preference.Preference}
    123 sebagai ganti
    124 objek {@link android.view.View}, Anda perlu menggunakan {@link android.app.Activity} khusus atau
    125 subkelas {@link android.app.Fragment} untuk menampilkan pengaturan daftar:</p>
    126 
    127 <ul>
    128   <li>Jika aplikasi Anda mendukung versi Android yang lebih lama dari 3.0 (API level 10 dan yang lebih rendah), Anda harus
    129 membangun aktivitas sebagai ekstensi dari kelas {@link android.preference.PreferenceActivity}.</li>
    130   <li>Pada Android 3.0 dan yang lebih baru, sebaiknya Anda menggunakan {@link android.app.Activity} biasa
    131 yang menjadi host {@link android.preference.PreferenceFragment} yang menampilkan pengaturan aplikasi Anda.
    132 Akan tetapi, Anda juga bisa menggunakan {@link android.preference.PreferenceActivity} untuk membuat layout dua panel
    133 bagi layar besar bila Anda memiliki beberapa grup pengaturan.</li>
    134 </ul>
    135 
    136 <p>Cara mengatur {@link android.preference.PreferenceActivity} Anda dan instance {@link
    137 android.preference.PreferenceFragment} dibahas di bagian tentang <a href="#Activity">Membuat Aktivitas Preferensi</a> dan <a href="#Fragment">Menggunakan
    138 Fragmen Preferensi</a>.</p>
    139 
    140 
    141 <h3 id="SettingTypes">Preferensi</h3>
    142 
    143 <p>Setiap pengaturan untuk aplikasi Anda diwakili oleh subkelas khusus dari kelas {@link
    144 android.preference.Preference}. Setiap subkelas menyertakan seperangkat properti utama yang memungkinkan Anda
    145 untuk menetapkan berbagai hal seperti judul pengaturan dan nilai default. Setiap subkelas juga menyediakan
    146 antarmuka pengguna dan properti khusus miliknya sendiri. Misalnya, gambar 1 menampilkan cuplikan layar dari
    147  pengaturan aplikasi Messaging. Setiap item daftar dalam layar pengaturan didukung oleh objek {@link
    148 android.preference.Preference} berbeda.</p>
    149 
    150 <p>Beberapa preferensi yang paling umum adalah:</p>
    151 
    152 <dl>
    153   <dt>{@link android.preference.CheckBoxPreference}</dt>
    154   <dd>Menampilkan item dengan kotak cek untuk pengaturan yang diaktifkan atau dinonaktifkan. Nilai
    155 tersimpan adalah boolean (<code>true</code> jika diberi tanda cek).</dd>
    156 
    157   <dt>{@link android.preference.ListPreference}</dt>
    158   <dd>Membuka dialog berisi daftar tombol radio. Nilai
    159 tersimpan bisa berupa tipe nilai apa pun yang didukung (tercantum di atas).</dd>
    160 
    161   <dt>{@link android.preference.EditTextPreference}</dt>
    162   <dd>Membuka dialog berisi widget {@link android.widget.EditText}. Nilai tersimpan adalah {@link
    163 java.lang.String}.</dd>
    164 </dl>
    165 
    166 <p>Lihat kelas {@link android.preference.Preference} untuk mengetahui daftar subkelas lain dan
    167 propertinya.</p>
    168 
    169 <p>Tentu saja, kelas bawaan tidak mengakomodasi setiap kebutuhan dan aplikasi Anda mungkin memerlukan
    170 sesuatu yang lebih khusus. Misalnya, platform saat ini tidak menyediakan kelas {@link
    171 android.preference.Preference} untuk mengambil nomor atau tanggal. Anda mungkin perlu mendefinisikan
    172 subkelas {@link android.preference.Preference} sendiri. Untuk bantuan melakukannya, lihat bagian tentang <a href="#Custom">Membangun Preferensi Custom</a>.</p>
    173 
    174 
    175 
    176 <h2 id="DefiningPrefs">Mendefinisikan Preferensi dalam XML</h2>
    177 
    178 <p>Meskipun bisa membuat instance objek {@link android.preference.Preference} baru saat runtime, Anda
    179 harus mendefinisikan daftar pengaturan dalam XML dengan hierarki objek
    180 {@link android.preference.Preference}. Menggunakan file XML untuk mendefinisikan sekumpulan pengaturan lebih disukai karena file
    181 menyediakan struktur yang mudah dibaca dan diperbarui. Selain itu, pengaturan aplikasi Anda
    182 umumnya telah ditetapkan sebelumnya, meskipun Anda masih bisa memodifikasi kumpulan tersebut saat runtime.</p>
    183 
    184 <p>Setiap subkelas {@link android.preference.Preference} bisa dideklarasikan dengan elemen XML yang
    185 cocok dengan nama kelas, seperti {@code &lt;CheckBoxPreference&gt;}.</p>
    186 
    187 <p>Anda harus menyimpan file XML dalam direktori {@code res/xml/}. Meskipun bisa memberi nama file
    188 sesuka Anda, biasanya file diberi nama {@code preferences.xml}. Biasanya Anda hanya memerlukan satu file,
    189 karena cabang di hierarki (yang membuka daftar pengaturanny sendiri) dideklarasikan menggunakan instance
    190 tersarang {@link android.preference.PreferenceScreen}.</p>
    191 
    192 <p class="note"><strong>Catatan:</strong> Jika ingin membuat layout multipanel untuk
    193 pengaturan, Anda memerlukan file XML terpisah untuk setiap fragmen.</p>
    194 
    195 <p>Simpul akar untuk file XML harus merupakan elemen {@link android.preference.PreferenceScreen
    196 &lt;PreferenceScreen&gt;}. Dalam elemen inilah tempat Anda menambahkan setiap {@link
    197 android.preference.Preference}. Setiap anak yang Anda tambahkan dalam elemen
    198 {@link android.preference.PreferenceScreen &lt;PreferenceScreen&gt;} akan tampak sebagai item
    199 tunggal dalam daftar pengaturan.</p>
    200 
    201 <p>Misalnya:</p>
    202 
    203 <pre>
    204 &lt;?xml version="1.0" encoding="utf-8"?>
    205 &lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    206     &lt;CheckBoxPreference
    207         android:key="pref_sync"
    208         android:title="@string/pref_sync"
    209         android:summary="@string/pref_sync_summ"
    210         android:defaultValue="true" />
    211     &lt;ListPreference
    212         android:dependency="pref_sync"
    213         android:key="pref_syncConnectionType"
    214         android:title="@string/pref_syncConnectionType"
    215         android:dialogTitle="@string/pref_syncConnectionType"
    216         android:entries="@array/pref_syncConnectionTypes_entries"
    217         android:entryValues="@array/pref_syncConnectionTypes_values"
    218         android:defaultValue="@string/pref_syncConnectionTypes_default" />
    219 &lt;/PreferenceScreen>
    220 </pre>
    221 
    222 <p>Dalam contoh ini, terdapat {@link android.preference.CheckBoxPreference} dan {@link
    223 android.preference.ListPreference}. Kedua item tersebut menyertakan tiga atribut berikut:</p>
    224 
    225 <dl>
    226   <dt>{@code android:key}</dt>
    227   <dd>Atribut ini diperlukan untuk preferensi yang mempertahankan nilai data. Ini menetapkan kunci
    228 unik (string) yang digunakan sistem saat menyimpan nilai pengaturan ini dalam {@link
    229 android.content.SharedPreferences}.
    230   <p>Instance satu-satunya di mana atribut ini <em>tidak diperlukan</em> adalah bila preferensi berupa
    231 {@link android.preference.PreferenceCategory} atau {@link android.preference.PreferenceScreen}, atau
    232 preferensi menetapkan {@link android.content.Intent} untuk dipanggil (dengan elemen <a href="#Intents">{@code &lt;intent&gt;}</a>) atau {@link android.app.Fragment} untuk ditampilkan (dengan atribut <a href="{@docRoot}reference/android/preference/Preference.html#attr_android:fragment">{@code
    233 android:fragment}</a>).</p>
    234   </dd>
    235   <dt>{@code android:title}</dt>
    236   <dd>Ini menyediakan nama pengaturan yang bisa dilihat oleh pengguna.</dd>
    237   <dt>{@code android:defaultValue}</dt>
    238   <dd>Ini menetapkan nilai awal yang harus diatur sistem dalam file {@link
    239 android.content.SharedPreferences}. Anda harus memberikan nilai default untuk semua
    240 pengaturan.</dd>
    241 </dl>
    242 
    243 <p>Untuk informasi tentang semua atribut lain yang didukung, lihat dokumentasi {@link
    244 android.preference.Preference} (dan subkelas masing-masing).</p>
    245 
    246 
    247 <div class="figure" style="width:300px">
    248   <img src="{@docRoot}images/ui/settings/settings-titles.png" alt="" />
    249   <p class="img-caption"><strong>Gambar 2.</strong> Mengatur kategori
    250     dengan judul. <br/><b>1.</b> Kategori ditetapkan oleh elemen {@link
    251 android.preference.PreferenceCategory &lt;PreferenceCategory&gt;}. <br/><b>2.</b> Judul
    252 ditetapkan dengan atribut {@code android:title}.</p>
    253 </div>
    254 
    255 
    256 <p>Bila daftar pengaturan Anda melebihi sekitar 10 item, Anda mungkin perlu menambahkan judul untuk
    257 mendefinisikan grup pengaturan atau menampilkan grup tersebut di
    258 layar terpisah. Opsi ini dijelaskan di bagian berikut.</p>
    259 
    260 
    261 <h3 id="Groups">Membuat grup pengaturan</h3>
    262 
    263 <p>Jika Anda menampilkan daftar 10 pengaturan atau lebih, pengguna
    264 mungkin akan kesulitan dalam memindai, memahami dan memprosesnya. Anda bisa mengatasinya dengan
    265 membagi sebagian atau semua pengaturan ke dalam beberapa grup, yang secara efektif akan mengubah satu daftar panjang menjadi beberapa daftar
    266 yang lebih pendek. Suatu grup pengaturan terkait bisa ditampilkan dalam salah satu dari dua cara:</p>
    267 
    268 <ul>
    269   <li><a href="#Titles">Menggunakan judul</a></li>
    270   <li><a href="#Subscreens">Menggunakan sublayar</a></li>
    271 </ul>
    272 
    273 <p>Anda bisa menggunakan salah satu atau keduanya untuk mengelola pengaturan aplikasi Anda. Saat
    274 memutuskan mana yang akan digunakan dan cara membagi pengaturan, Anda harus mengikuti pedoman dalam
    275 Panduan <a href="{@docRoot}design/patterns/settings.html">Pengaturan</a> Desain Android.</p>
    276 
    277 
    278 <h4 id="Titles">Menggunakan judul</h4>
    279 
    280 <p>Jika ingin menyediakan divider dengan heading di antara grup pengaturan (seperti yang ditampilkan dalam gambar 2),
    281 tempatkan setiap grup objek {@link android.preference.Preference} di dalam {@link
    282 android.preference.PreferenceCategory}.</p>
    283 
    284 <p>Misalnya:</p>
    285 
    286 <pre>
    287 &lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    288     &lt;PreferenceCategory
    289         android:title="&#64;string/pref_sms_storage_title"
    290         android:key="pref_key_storage_settings">
    291         &lt;CheckBoxPreference
    292             android:key="pref_key_auto_delete"
    293             android:summary="&#64;string/pref_summary_auto_delete"
    294             android:title="&#64;string/pref_title_auto_delete"
    295             android:defaultValue="false"... />
    296         &lt;Preference
    297             android:key="pref_key_sms_delete_limit"
    298             android:dependency="pref_key_auto_delete"
    299             android:summary="&#64;string/pref_summary_delete_limit"
    300             android:title="&#64;string/pref_title_sms_delete"... />
    301         &lt;Preference
    302             android:key="pref_key_mms_delete_limit"
    303             android:dependency="pref_key_auto_delete"
    304             android:summary="&#64;string/pref_summary_delete_limit"
    305             android:title="&#64;string/pref_title_mms_delete" ... />
    306     &lt;/PreferenceCategory>
    307     ...
    308 &lt;/PreferenceScreen>
    309 </pre>
    310 
    311 
    312 <h4 id="Subscreens">Menggunakan sublayar</h4>
    313 
    314 <p>Jika ingin menempatkan grup pengaturan ke dalam sublayar (seperti yang ditampilkan dalam gambar 3), tempatkan grup
    315 objek {@link android.preference.Preference} di dalam {@link
    316 android.preference.PreferenceScreen}.</p>
    317 
    318 <img src="{@docRoot}images/ui/settings/settings-subscreen.png" alt="" />
    319 <p class="img-caption"><strong>Gambar 3.</strong> Mengatur sublayar. Elemen {@code
    320 &lt;PreferenceScreen&gt;}
    321 membuat item yang, bila dipilih, akan membuka daftar terpisah untuk menampilkan pengaturan tersarang.</p>
    322 
    323 <p>Misalnya:</p>
    324 
    325 <pre>
    326 &lt;PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    327     &lt;!-- opens a subscreen of settings -->
    328     &lt;PreferenceScreen
    329         android:key="button_voicemail_category_key"
    330         android:title="&#64;string/voicemail"
    331         android:persistent="false">
    332         &lt;ListPreference
    333             android:key="button_voicemail_provider_key"
    334             android:title="&#64;string/voicemail_provider" ... />
    335         &lt;!-- opens another nested subscreen -->
    336         &lt;PreferenceScreen
    337             android:key="button_voicemail_setting_key"
    338             android:title="&#64;string/voicemail_settings"
    339             android:persistent="false">
    340             ...
    341         &lt;/PreferenceScreen>
    342         &lt;RingtonePreference
    343             android:key="button_voicemail_ringtone_key"
    344             android:title="&#64;string/voicemail_ringtone_title"
    345             android:ringtoneType="notification" ... />
    346         ...
    347     &lt;/PreferenceScreen>
    348     ...
    349 &lt;/PreferenceScreen>
    350 </pre>
    351 
    352 
    353 <h3 id="Intents">Menggunakan intent</h3>
    354 
    355 <p>Dalam beberapa kasus, Anda mungkin ingin item preferensi untuk membuka beberapa aktivitas sebagai ganti
    356 layar pengaturan, seperti browser web untuk melihat halaman web. Untuk memanggil {@link
    357 android.content.Intent} saat pengguna memilih item preferensi, tambahkan elemen {@code &lt;intent&gt;}
    358 sebagai anak dari elemen {@code &lt;Preference&gt;} yang bersangkutan.</p>
    359 
    360 <p>Misalnya, berikut ini cara menggunakan item preferensi untuk membuka halaman web:</p>
    361 
    362 <pre>
    363 &lt;Preference android:title="@string/prefs_web_page" >
    364     &lt;intent android:action="android.intent.action.VIEW"
    365             android:data="http://www.example.com" />
    366 &lt;/Preference>
    367 </pre>
    368 
    369 <p>Anda bisa membuat intent implisit maupun eksplisit menggunakan atribut berikut:</p>
    370 
    371 <dl>
    372   <dt>{@code android:action}</dt>
    373     <dd>Tindakan yang akan ditetapkan, sesuai metode
    374 {@link android.content.Intent#setAction setAction()}.</dd>
    375   <dt>{@code android:data}</dt>
    376     <dd>Data yang akan ditetapkan, sesuai metode {@link android.content.Intent#setData setData()}.</dd>
    377   <dt>{@code android:mimeType}</dt>
    378     <dd>Tipe MIME yang akan ditetapkan, sesuai metode
    379 {@link android.content.Intent#setType setType()}.</dd>
    380   <dt>{@code android:targetClass}</dt>
    381     <dd>Bagian kelas dari nama komponen, sesuai metode {@link android.content.Intent#setComponent
    382 setComponent()}.</dd>
    383   <dt>{@code android:targetPackage}</dt>
    384     <dd>Bagian paket dari nama komponen, sesuai metode {@link
    385 android.content.Intent#setComponent setComponent()}.</dd>
    386 </dl>
    387 
    388 
    389 
    390 <h2 id="Activity">Membuat Aktivitas Preferensi</h2>
    391 
    392 <p>Untuk menampilkan pengaturan Anda dalam suatu aktivitas, perluas kelas {@link
    393 android.preference.PreferenceActivity}. Ini adalah ekstensi dari kelas {@link
    394 android.app.Activity} biasa yang menampilkan daftar pengaturan berdasarkan hierarki objek {@link
    395 android.preference.Preference}. {@link android.preference.PreferenceActivity}
    396 secara otomatis mempertahankan pengaturan yang dikaitkan dengan setiap {@link
    397 android.preference.Preference} bila pengguna membuat perubahan.</p>
    398 
    399 <p class="note"><strong>Catatan:</strong> Jika Anda mengembangkan aplikasi untuk Android 3.0 dan
    400 yang lebih tinggi, sebaiknya gunakan {@link android.preference.PreferenceFragment}. Pindah ke bagian
    401 berikutnya tentang <a href="#Fragment">Menggunakan Fragmen Preferensi</a>.</p>
    402 
    403 <p>Hal paling penting untuk diingat adalah jangan memuat layout tampilan selama callback {@link
    404 android.preference.PreferenceActivity#onCreate onCreate()}. Sebagai gantinya, panggil {@link
    405 android.preference.PreferenceActivity#addPreferencesFromResource addPreferencesFromResource()} untuk
    406 menambahkan preferensi yang telah Anda deklarasikan dalam file XML ke aktivitas. Misalnya, berikut ini adalah kode minimum
    407 polos yang diperlukan untuk {@link android.preference.PreferenceActivity} fungsional:</p>
    408 
    409 <pre>
    410 public class SettingsActivity extends PreferenceActivity {
    411     &#64;Override
    412     public void onCreate(Bundle savedInstanceState) {
    413         super.onCreate(savedInstanceState);
    414         addPreferencesFromResource(R.xml.preferences);
    415     }
    416 }
    417 </pre>
    418 
    419 <p>Ini sebenarnya kode yang cukup untuk beberapa aplikasi, karena segera setelah pengguna memodifikasi preferensi,
    420 sistem akan menyimpan perubahan tersebut ke file {@link android.content.SharedPreferences} default yang
    421 bisa dibaca oleh komponen aplikasi Anda lainnya bila Anda perlu memeriksa pengaturan pengguna. Akan tetapi,
    422 banyak aplikasi, yang memerlukan kode lebih sedikit untuk mendengarkan perubahan yang terjadi pada preferensi.
    423 Untuk informasi tentang mendengarkan perubahan di file {@link android.content.SharedPreferences},
    424 lihat bagian tentang <a href="#ReadingPrefs">Preferensi Membaca</a>.</p>
    425 
    426 
    427 
    428 
    429 <h2 id="Fragment">Menggunakan Fragmen Preferensi</h2>
    430 
    431 <p>Jika Anda mengembangkan Android 3.0 (API level 11) dan yang lebih tinggi, Anda harus menggunakan {@link
    432 android.preference.PreferenceFragment} untuk menampilkan daftar objek {@link android.preference.Preference}
    433 Anda. Anda bisa menambahkan {@link android.preference.PreferenceFragment} ke aktivitas apa pun,&mdash;Anda tidak
    434 perlu menggunakan {@link android.preference.PreferenceActivity}.</p>
    435 
    436 <p><a href="{@docRoot}guide/components/fragments.html">Fragmen</a> menyediakan arsitektur yang lebih
    437 fleksibel untuk aplikasi Anda, dibandingkan hanya menggunakan aktivitas, apa pun jenis
    438 aktivitas yang Anda bangun. Dengan sendirinya, kami menyarankan Anda menggunakan {@link
    439 android.preference.PreferenceFragment} untuk mengontrol tampilan pengaturan Anda sebagai ganti {@link
    440 android.preference.PreferenceActivity} bila memungkinkan.</p>
    441 
    442 <p>Implementasi {@link android.preference.PreferenceFragment} Anda bisa semudah
    443 mendefinisikan metode {@link android.preference.PreferenceFragment#onCreate onCreate()} untuk memuat
    444 file preferensi dengan {@link android.preference.PreferenceFragment#addPreferencesFromResource
    445 addPreferencesFromResource()}. Misalnya:</p>
    446 
    447 <pre>
    448 public static class SettingsFragment extends PreferenceFragment {
    449     &#64;Override
    450     public void onCreate(Bundle savedInstanceState) {
    451         super.onCreate(savedInstanceState);
    452 
    453         // Load the preferences from an XML resource
    454         addPreferencesFromResource(R.xml.preferences);
    455     }
    456     ...
    457 }
    458 </pre>
    459 
    460 <p>Anda nanti bisa menambahkan fragmen ini ke {@link android.app.Activity} seperti yang Anda lakukan untuk
    461 {@link android.app.Fragment} lainnya. Misalnya:</p>
    462 
    463 <pre>
    464 public class SettingsActivity extends Activity {
    465     &#64;Override
    466     protected void onCreate(Bundle savedInstanceState) {
    467         super.onCreate(savedInstanceState);
    468 
    469         // Display the fragment as the main content.
    470         getFragmentManager().beginTransaction()
    471                 .replace(android.R.id.content, new SettingsFragment())
    472                 .commit();
    473     }
    474 }
    475 </pre>
    476 
    477 <p class="note"><strong>Catatan:</strong> {@link android.preference.PreferenceFragment} tidak memiliki
    478 objek {@link android.content.Context} sendiri. Jika memerlukan objek {@link android.content.Context}
    479 , Anda bisa memanggil {@link android.app.Fragment#getActivity()}. Akan tetapi, berhati-hatilah untuk memanggil
    480 {@link android.app.Fragment#getActivity()} hanya bila fragmen telah dikaitkan dengan aktivitas. Bila
    481 fragmen belum dikaitkan, atau terlepas saat akhir daur hidupnya, {@link
    482 android.app.Fragment#getActivity()} akan mengembalikan nol.</p>
    483 
    484 
    485 <h2 id="Defaults">Mengatur Nilai Default</h2>
    486 
    487 <p>Preferensi yang Anda buat mungkin mendefinisikan beberapa perilaku penting untuk aplikasi, jadi Anda
    488 perlu menginisialisasi file {@link android.content.SharedPreferences} yang terkait dengan
    489 nilai default untuk setiap {@link android.preference.Preference} bila pengguna menggunakan aplikasi
    490 Anda untuk pertama kali.</p>
    491 
    492 <p>Hal pertama yang harus Anda lakukan adalah menetapkan nilai default untuk setiap objek {@link
    493 android.preference.Preference}
    494 di file XML Anda menggunakan atribut {@code android:defaultValue}. Nilainya bisa berupa tipe data
    495 apa saja yang sesuai untuk objek {@link android.preference.Preference} bersangkutan. Misalnya:
    496 </p>
    497 
    498 <pre>
    499 &lt;!-- default value is a boolean -->
    500 &lt;CheckBoxPreference
    501     android:defaultValue="true"
    502     ... />
    503 
    504 &lt;!-- default value is a string -->
    505 &lt;ListPreference
    506     android:defaultValue="@string/pref_syncConnectionTypes_default"
    507     ... />
    508 </pre>
    509 
    510 <p>Kemudian, dari metode {@link android.app.Activity#onCreate onCreate()} dalam aktivitas utama aplikasi
    511 Anda&mdash;dan dalam aktivitas lainnya yang digunakan pengguna untuk masuk ke aplikasi Anda untuk pertama kali
    512 &mdash;panggil {@link android.preference.PreferenceManager#setDefaultValues
    513 setDefaultValues()}:</p>
    514 
    515 <pre>
    516 PreferenceManager.setDefaultValues(this, R.xml.advanced_preferences, false);
    517 </pre>
    518 
    519 <p>Memanggil ini selama {@link android.app.Activity#onCreate onCreate()} akan memastikan aplikasi
    520 Anda diinisialisasi dengan pengaturan default, yang mungkin perlu
    521 dibaca oleh aplikasi Anda untuk menentukan beberapa perilaku (seperti apakah akan mengunduh data pada
    522 jaringan seluler).</p>
    523 
    524 <p>Metode ini membutuhkan tiga argumen:</p>
    525 <ul>
    526   <li>{@link android.content.Context} aplikasi Anda.</li>
    527   <li>ID sumber daya untuk file XML preferensi yang ingin Anda atur nilai defaultnya.</li>
    528   <li>Boolean menunjukkan apakah nilai default harus diatur lebih dari satu kali.
    529 <p>Bila <code>false</code>, sistem akan mengatur nilai default hanya jika metode ini belum pernah
    530 dipanggil sebelumnya (atau {@link android.preference.PreferenceManager#KEY_HAS_SET_DEFAULT_VALUES}
    531 dalam file preferensi berbagi nilai default salah).</p></li>
    532 </ul>
    533 
    534 <p>Selama Anda mengatur argumen ketiga ke <code>false</code>, Anda bisa dengan aman memanggil metode ini
    535 setiap kali aktivitas Anda memulai tanpa mengesampingkan preferensi tersimpan pengguna dengan mengatur ulang preferensi tersebut ke
    536 default. Akan tetapi, jika mengatur ke <code>true</code>, Anda akan mengesampingkan nilai
    537 sebelumnya dengan default.</p>
    538 
    539 
    540 
    541 <h2 id="PreferenceHeaders">Menggunakan Header Preferensi</h2>
    542 
    543 <p>Dalam kasus yang jarang terjadi, Anda mungkin perlu mendesain pengaturan agar layar pertama
    544 hanya menampilkan daftar <a href="#Subscreens">sublayar</a> (seperti dalam aplikasi Setting pada sistem,
    545 seperti yang ditampilkan dalam gambar 4 dan 5). Bila mengembangkan desain seperti itu untuk Android 3.0 dan yang lebih tinggi, Anda
    546 harus menggunakan fitur "header" yang baru di Android 3.0, sebagai ganti membangun sublayar dengan elemen
    547 {@link android.preference.PreferenceScreen} tersarang.</p>
    548 
    549 <p>Untuk membangun pengaturan dengan header, Anda perlu:</p>
    550 <ol>
    551   <li>Memisahkan setiap grup pengaturan ke dalam instance {@link
    552 android.preference.PreferenceFragment} terpisah. Ini berarti, setiap grup pengaturan memerlukan file XML
    553 terpisah.</li>
    554   <li>Membuat file header XML yang mencantumkan daftar setiap grup pengaturan dan mendeklarasikan fragmen mana
    555 yang berisi daftar pengaturan yang sesuai.</li>
    556   <li>Memperluas kelas {@link android.preference.PreferenceActivity} untuk menjadi host pengaturan Anda.</li>
    557   <li>Mengimplementasikan callback {@link
    558 android.preference.PreferenceActivity#onBuildHeaders onBuildHeaders()} untuk menetapkan file
    559 header.</li>
    560 </ol>
    561 
    562 <p>Manfaat besar dalam menggunakan desain ini adalah karena {@link android.preference.PreferenceActivity}
    563 secara otomatis akan menampilkan layout dua panel yang ditampilkan dalam gambar 4 bila dijalankan pada layar besar.</p>
    564 
    565 <p>Bahkan jika aplikasi Anda mendukung versi Android yang lebih lama dari 3.0, Anda bisa membangun
    566 aplikasi untuk menggunakan {@link android.preference.PreferenceFragment} bagi presentasi dua panel pada perangkat
    567 yang lebih baru sementara tetap mendukung hierarki multilayar biasa pada perangkat
    568 yang lebih lama (lihat bagian tentang <a href="#BackCompatHeaders">Mendukung versi yang lebih lama dengan
    569 header preferensi</a>).</p>
    570 
    571 <img src="{@docRoot}images/ui/settings/settings-headers-tablet.png" alt="" />
    572 <p class="img-caption"><strong>Gambar 4.</strong> Layout dua panel dengan header. <br/><b>1.</b> Header
    573 didefinisikan dengan file header XML. <br/><b>2.</b> Setiap grup pengaturan didefinisikan dengan
    574 {@link android.preference.PreferenceFragment} yang ditetapkan oleh elemen {@code &lt;header&gt;} dalam
    575 file header.</p>
    576 
    577 <img src="{@docRoot}images/ui/settings/settings-headers-handset.png" alt="" />
    578 <p class="img-caption"><strong>Gambar 5.</strong> Perangkat handset dengan header pengaturan. Bila sebuah
    579 item dipilih, {@link android.preference.PreferenceFragment} terkait akan menggantikan
    580 header.</p>
    581 
    582 
    583 <h3 id="CreateHeaders" style="clear:left">Membuat file header</h3>
    584 
    585 <p>Setiap grup pengaturan dalam daftar header Anda akan ditetapkan oleh elemen {@code &lt;header&gt;}
    586 tunggal dalam elemen {@code &lt;preference-headers&gt;} akar. Misalnya:</p>
    587 
    588 <pre>
    589 &lt;?xml version="1.0" encoding="utf-8"?>
    590 &lt;preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    591     &lt;header
    592         android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentOne"
    593         android:title="@string/prefs_category_one"
    594         android:summary="@string/prefs_summ_category_one" />
    595     &lt;header
    596         android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentTwo"
    597         android:title="@string/prefs_category_two"
    598         android:summary="@string/prefs_summ_category_two" >
    599         &lt;!-- key/value pairs can be included as arguments for the fragment. -->
    600         &lt;extra android:name="someKey" android:value="someHeaderValue" />
    601     &lt;/header>
    602 &lt;/preference-headers>
    603 </pre>
    604 
    605 <p>Dengan atribut {@code android:fragment}, setiap header mendeklarasikan instance {@link
    606 android.preference.PreferenceFragment} yang harus terbuka saat pengguna memilih header.</p>
    607 
    608 <p>Elemen {@code &lt;extras&gt;} memungkinkan Anda meneruskan pasangan nilai-kunci ke fragmen di {@link
    609 android.os.Bundle}. Fragmen bisa mengambil argumen dengan memanggil {@link
    610 android.app.Fragment#getArguments()}. Anda bisa meneruskan argumen ke fragmen dengan berbagai
    611 alasan, namun satu alasan yang baik adalah untuk menggunakan kembali subkelas yang sama dari {@link
    612 android.preference.PreferenceFragment} untuk setiap grup dan menggunakan argumen untuk menetapkan file
    613 XML preferensi mana yang harus dimuat fragmen.</p>
    614 
    615 <p>Misalnya, ada fragmen yang bisa digunakan ulang untuk berbagai grup pengaturan, bila setiap
    616 header mendefinisikan argumen {@code &lt;extra&gt;} dengan kunci {@code "settings"}:</p>
    617 
    618 <pre>
    619 public static class SettingsFragment extends PreferenceFragment {
    620     &#64;Override
    621     public void onCreate(Bundle savedInstanceState) {
    622         super.onCreate(savedInstanceState);
    623 
    624         String settings = getArguments().getString("settings");
    625         if ("notifications".equals(settings)) {
    626             addPreferencesFromResource(R.xml.settings_wifi);
    627         } else if ("sync".equals(settings)) {
    628             addPreferencesFromResource(R.xml.settings_sync);
    629         }
    630     }
    631 }
    632 </pre>
    633 
    634 
    635 
    636 <h3 id="DisplayHeaders">Menampilkan header</h3>
    637 
    638 <p>Untuk menampilkan header preferensi, Anda harus mengimplementasikan metode callback {@link
    639 android.preference.PreferenceActivity#onBuildHeaders onBuildHeaders()} dan memanggil
    640 {@link android.preference.PreferenceActivity#loadHeadersFromResource
    641 loadHeadersFromResource()}. Misalnya:</p>
    642 
    643 <pre>
    644 public class SettingsActivity extends PreferenceActivity {
    645     &#64;Override
    646     public void onBuildHeaders(List&lt;Header> target) {
    647         loadHeadersFromResource(R.xml.preference_headers, target);
    648     }
    649 }
    650 </pre>
    651 
    652 <p>Bila pengguna memilih item dari daftar header, sistem akan membuka {@link
    653 android.preference.PreferenceFragment} terkait.</p>
    654 
    655 <p class="note"><strong>Catatan:</strong> Saat menggunakan header preferensi, subkelas {@link
    656 android.preference.PreferenceActivity} Anda tidak perlu mengimplementasikan metode {@link
    657 android.preference.PreferenceActivity#onCreate onCreate()}, karena tugas
    658 yang diperlukan untuk aktivitas hanyalah memuat header.</p>
    659 
    660 
    661 <h3 id="BackCompatHeaders">Mendukung versi yang lebih lama dengan header preferensi</h3>
    662 
    663 <p>Jika aplikasi Anda mendukung versi Android yang lebih lama dari 3.0, Anda tetap bisa menggunakan header untuk
    664 menyediakan layout dua panel saat berjalan pada Android 3.0 dan yang lebih tinggi. Anda hanya perlu membuat
    665 file XML preferensi tambahan yang menggunakan elemen {@link android.preference.Preference
    666 &lt;Preference&gt;} dasar yang berperilaku seperti item header (untuk digunakan oleh Android
    667 versi yang lebih lama).</p>
    668 
    669 <p>Akan tetapi, sebagai ganti membuka {@link android.preference.PreferenceScreen} baru, setiap elemen {@link
    670 android.preference.Preference &lt;Preference&gt;} mengirimkan {@link android.content.Intent} ke
    671 {@link android.preference.PreferenceActivity} yang menetapkan file XML preferensi mana yang
    672 akan dimuat.</p>
    673 
    674 <p>Misalnya, ini adalah file XML untuk header preferensi yang menggunakan Android 3.0
    675 dan yang lebih tinggi ({@code res/xml/preference_headers.xml}):</p>
    676 
    677 <pre>
    678 &lt;preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    679     &lt;header
    680         android:fragment="com.example.prefs.SettingsFragmentOne"
    681         android:title="@string/prefs_category_one"
    682         android:summary="@string/prefs_summ_category_one" />
    683     &lt;header
    684         android:fragment="com.example.prefs.SettingsFragmentTwo"
    685         android:title="@string/prefs_category_two"
    686         android:summary="@string/prefs_summ_category_two" />
    687 &lt;/preference-headers>
    688 </pre>
    689 
    690 <p>Dan ini adalah file preferensi yang menyediakan header yang sama untuk versi yang lebih lama dari
    691 Android 3.0 ({@code res/xml/preference_headers_legacy.xml}):</p>
    692 
    693 <pre>
    694 &lt;PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    695     &lt;Preference
    696         android:title="@string/prefs_category_one"
    697         android:summary="@string/prefs_summ_category_one"  >
    698         &lt;intent
    699             android:targetPackage="com.example.prefs"
    700             android:targetClass="com.example.prefs.SettingsActivity"
    701             android:action="com.example.prefs.PREFS_ONE" />
    702     &lt;/Preference>
    703     &lt;Preference
    704         android:title="@string/prefs_category_two"
    705         android:summary="@string/prefs_summ_category_two" >
    706         &lt;intent
    707             android:targetPackage="com.example.prefs"
    708             android:targetClass="com.example.prefs.SettingsActivity"
    709             android:action="com.example.prefs.PREFS_TWO" />
    710     &lt;/Preference>
    711 &lt;/PreferenceScreen>
    712 </pre>
    713 
    714 <p>Karena dukungan untuk {@code &lt;preference-headers&gt;} telah ditambahkan di Android 3.0, sistem akan memanggil
    715 {@link android.preference.PreferenceActivity#onBuildHeaders onBuildHeaders()} di {@link
    716 android.preference.PreferenceActivity} hanya saat berjalan pada Android 3.0 atau yang lebih tinggi. Untuk memuat
    717 file header "lama" ({@code preference_headers_legacy.xml}), Anda harus memeriksa versi Android
    718 dan, jika versi tersebut lebih lama dari Android 3.0 ({@link
    719 android.os.Build.VERSION_CODES#HONEYCOMB}), panggil {@link
    720 android.preference.PreferenceActivity#addPreferencesFromResource addPreferencesFromResource()} untuk
    721 memuat file header lama. Misalnya:</p>
    722 
    723 <pre>
    724 &#64;Override
    725 public void onCreate(Bundle savedInstanceState) {
    726     super.onCreate(savedInstanceState);
    727     ...
    728 
    729     if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.HONEYCOMB) {
    730         // Load the legacy preferences headers
    731         addPreferencesFromResource(R.xml.preference_headers_legacy);
    732     }
    733 }
    734 
    735 // Called only on Honeycomb and later
    736 &#64;Override
    737 public void onBuildHeaders(List&lt;Header> target) {
    738    loadHeadersFromResource(R.xml.preference_headers, target);
    739 }
    740 </pre>
    741 
    742 <p>Satu-satunya hal yang perlu dilakukan adalah menangani {@link android.content.Intent} yang diteruskan ke
    743 aktivitas untuk mengidentifikasi file preferensi yang akan dimuat. Jadi ambillah tindakan intent dan bandingkan dengan
    744 string tindakan yang diketahui yang telah Anda gunakan dalam tag {@code &lt;intent&gt;} XML preferensi:</p>
    745 
    746 <pre>
    747 final static String ACTION_PREFS_ONE = "com.example.prefs.PREFS_ONE";
    748 ...
    749 
    750 &#64;Override
    751 public void onCreate(Bundle savedInstanceState) {
    752     super.onCreate(savedInstanceState);
    753 
    754     String action = getIntent().getAction();
    755     if (action != null &amp;&amp; action.equals(ACTION_PREFS_ONE)) {
    756         addPreferencesFromResource(R.xml.preferences);
    757     }
    758     ...
    759 
    760     else if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.HONEYCOMB) {
    761         // Load the legacy preferences headers
    762         addPreferencesFromResource(R.xml.preference_headers_legacy);
    763     }
    764 }
    765 </pre>
    766 
    767 <p>Ketahuilah bahwa panggilan berturut-turut ke {@link
    768 android.preference.PreferenceActivity#addPreferencesFromResource addPreferencesFromResource()} akan
    769 menumpuk semua preferensi ke dalam satu daftar, jadi pastikan bahwa ini hanya dipanggil sekali dengan mengikatkan syarat
    770 ke pernyataan else-if.</p>
    771 
    772 
    773 
    774 
    775 
    776 <h2 id="ReadingPrefs">Preferensi Membaca</h2>
    777 
    778 <p>Secara default, semua preferensi aplikasi Anda disimpan ke file yang bisa diakses dari mana saja
    779 di dalam aplikasi dengan memanggil metode statis {@link
    780 android.preference.PreferenceManager#getDefaultSharedPreferences
    781 PreferenceManager.getDefaultSharedPreferences()}. Ini akan mengembalikan objek {@link
    782 android.content.SharedPreferences} berisi semua pasangan nilai-kunci yang terkait
    783 dengan objek {@link android.preference.Preference} yang digunakan di {@link
    784 android.preference.PreferenceActivity} Anda.</p>
    785 
    786 <p>Misalnya, inilah cara membaca salah satu nilai preferensi dari aktivitas lain dalam aplikasi
    787 Anda:</p>
    788 
    789 <pre>
    790 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    791 String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");
    792 </pre>
    793 
    794 
    795 
    796 <h3 id="Listening">Mendengarkan perubahan preferensi</h3>
    797 
    798 <p>Ada beberapa alasan yang membuat Anda perlu mendapatkan pemberitahuan segera setelah pengguna mengubah salah satu
    799 preferensi. Untuk menerima callback saat perubahan terjadi pada salah satu preferensi,
    800 implementasikan antarmuka {@link android.content.SharedPreferences.OnSharedPreferenceChangeListener
    801 SharedPreference.OnSharedPreferenceChangeListener} dan daftarkan listener untuk objek
    802 {@link android.content.SharedPreferences} dengan memanggil {@link
    803 android.content.SharedPreferences#registerOnSharedPreferenceChangeListener
    804 registerOnSharedPreferenceChangeListener()}.</p>
    805 
    806 <p>Antarmuka hanya memiliki satu metode callback, {@link
    807 android.content.SharedPreferences.OnSharedPreferenceChangeListener#onSharedPreferenceChanged
    808 onSharedPreferenceChanged()}, dan mungkin lebih mudah mengimplementasikan antarmuka sebagai bagian dari
    809 aktivitas Anda. Misalnya:</p>
    810 
    811 <pre>
    812 public class SettingsActivity extends PreferenceActivity
    813                               implements OnSharedPreferenceChangeListener {
    814     public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";
    815     ...
    816 
    817     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
    818         String key) {
    819         if (key.equals(KEY_PREF_SYNC_CONN)) {
    820             Preference connectionPref = findPreference(key);
    821             // Set summary to be the user-description for the selected value
    822             connectionPref.setSummary(sharedPreferences.getString(key, ""));
    823         }
    824     }
    825 }
    826 </pre>
    827 
    828 <p>Dalam contoh ini, metode akan memeriksa apakah pengaturan yang diubah adalah untuk kunci preferensi yang diketahui. Ini akan
    829 memanggil {@link android.preference.PreferenceActivity#findPreference findPreference()} untuk mendapatkan objek
    830 {@link android.preference.Preference} yang diubah agar bisa memodifikasi rangkuman item
    831 menjadi keterangan pada pilihan pengguna. Ini berarti, bila pengaturan adalah {@link
    832 android.preference.ListPreference} atau pengaturan multipilihan, Anda harus memanggil {@link
    833 android.preference.Preference#setSummary setSummary()} bila pengaturan berubah ke tampilkan
    834 status saat ini (seperti pengaturan Sleep yang ditampilkan dalam gambar 5).</p>
    835 
    836 <p class="note"><strong>Catatan:</strong> Seperti dijelaskan dalam dokumen Desain Android tentang <a href="{@docRoot}design/patterns/settings.html">Pengaturan</a>, kami merekomendasikan Anda untuk memperbarui
    837 rangkuman {@link android.preference.ListPreference} setiap kali pengguna mengubah preferensi untuk
    838 menjelaskan pengaturan saat ini.</p>
    839 
    840 <p>Untuk manajemen daur hidup yang baik di aktivitas, kami merekomendasikan Anda untuk mendaftarkan dan mencabut pendaftaran
    841 {@link android.content.SharedPreferences.OnSharedPreferenceChangeListener} selama callback {@link
    842 android.app.Activity#onResume} dan {@link android.app.Activity#onPause}:</p>
    843 
    844 <pre>
    845 &#64;Override
    846 protected void onResume() {
    847     super.onResume();
    848     getPreferenceScreen().getSharedPreferences()
    849             .registerOnSharedPreferenceChangeListener(this);
    850 }
    851 
    852 &#64;Override
    853 protected void onPause() {
    854     super.onPause();
    855     getPreferenceScreen().getSharedPreferences()
    856             .unregisterOnSharedPreferenceChangeListener(this);
    857 }
    858 </pre>
    859 
    860 <p class="caution"><strong>Perhatian:</strong> Bila Anda memanggil {@link
    861 android.content.SharedPreferences#registerOnSharedPreferenceChangeListener
    862 registerOnSharedPreferenceChangeListener()}, pengelola preferensi saat ini tidak akan
    863 menyimpan referensi kuat ke listener. Anda harus menyimpan referensi
    864 kuat bagi listener, atau referensi akan rentan terhadap pengumpulan sampah. Kami
    865 merekomendasikan Anda untuk mempertahankan referensi bagi listener dalam data instance objek
    866 yang akan ada selama Anda memerlukan listener tersebut.</p>
    867 
    868 <p>Misalnya, dalam kode berikut, caller tidak menyimpan referensi ke
    869 listener. Akibatnya, listener akan dikenakan pengumpulan sampah,
    870 dan suatu saat nanti akan gagal:</p>
    871 
    872 <pre>
    873 prefs.registerOnSharedPreferenceChangeListener(
    874   // Bad! The listener is subject to garbage collection!
    875   new SharedPreferences.OnSharedPreferenceChangeListener() {
    876   public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    877     // listener implementation
    878   }
    879 });
    880 </pre>
    881 
    882 <p>Sebagai gantinya, simpan referensi ke listener dalam bidang data instance
    883 objek yang akan ada selama listener dibutuhkan:</p>
    884 
    885 <pre>
    886 SharedPreferences.OnSharedPreferenceChangeListener listener =
    887     new SharedPreferences.OnSharedPreferenceChangeListener() {
    888   public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    889     // listener implementation
    890   }
    891 };
    892 prefs.registerOnSharedPreferenceChangeListener(listener);
    893 </pre>
    894 
    895 <h2 id="NetworkUsage">Mengelola Penggunaan Jaringan</h2>
    896 
    897 
    898 <p>Mulai Android 4.0, aplikasi Settings untuk sistem memungkinkan pengguna melihat seberapa besar
    899 data jaringan yang digunakan aplikasi mereka saat berada di latar depan dan latar belakang. Kemudian pengguna bisa
    900 menonaktifkan penggunaan data latar belakang untuk aplikasi individual. Agar pengguna tidak menonaktifkan akses
    901 aplikasi ke data dari latar belakang, Anda harus menggunakan koneksi data secara efisien dan mengizinkan
    902 pengguna untuk menyaring penggunaan data aplikasi melalui pengaturan aplikasi Anda.<p>
    903 
    904 <p>Misalnya, Anda bisa mengizinkan pengguna untuk mengontrol seberapa sering aplikasi menyinkronkan data, apakah aplikasi
    905 hanya melakukan pengunggahan/pengunduhan bila ada Wi-Fi, apakah aplikasi menggunakan data saat roaming, dll. Dengan
    906 tersedianya kontrol ini bagi pengguna, mereka kemungkinan besar tidak akan menonaktifkan akses aplikasi ke data
    907 saat mendekati batas yang mereka tetapkan dalam Settings pada sistem, karena mereka bisa mengontrol secara tepat
    908 seberapa besar data yang digunakan aplikasi Anda.</p>
    909 
    910 <p>Setelah menambahkan preferensi yang diperlukan dalam {@link android.preference.PreferenceActivity} Anda
    911 untuk mengontrol kebiasaan data aplikasi, Anda harus menambahkan filter intent untuk {@link
    912 android.content.Intent#ACTION_MANAGE_NETWORK_USAGE} dalam file manifes Anda. Misalnya:</p>
    913 
    914 <pre>
    915 &lt;activity android:name="SettingsActivity" ... >
    916     &lt;intent-filter>
    917        &lt;action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
    918        &lt;category android:name="android.intent.category.DEFAULT" />
    919     &lt;/intent-filter>
    920 &lt;/activity>
    921 </pre>
    922 
    923 <p>Filter intent ini menunjukkan pada sistem bahwa ini adalah aktivitas yang mengontrol penggunaan
    924 data aplikasi Anda. Jadi, saat pengguna memeriksa seberapa banyak data yang digunakan oleh aplikasi dari
    925 aplikasi Settings pada sistem, tombol <em>View application settings</em> akan tersedia dan menjalankan
    926 {@link android.preference.PreferenceActivity} sehingga pengguna bisa menyaring seberapa besar data yang digunakan
    927 aplikasi Anda.</p>
    928 
    929 
    930 
    931 
    932 
    933 
    934 
    935 <h2 id="Custom">Membangun Preferensi Custom</h2>
    936 
    937 <p>Kerangka kerja Android menyertakan berbagai subkelas {@link android.preference.Preference} yang
    938 memungkinkan Anda membangun UI untuk beberapa macam tipe pengaturan.
    939 Akan tetapi, Anda mungkin menemukan pengaturan yang diperlukan bila tidak ada solusi bawaan, seperti
    940 picker nomor atau picker tanggal. Dalam hal demikian, Anda akan perlu membuat preferensi custom dengan memperluas
    941 kelas {@link android.preference.Preference} atau salah satu subkelas lainnya.</p>
    942 
    943 <p>Bila memperluas kelas {@link android.preference.Preference}, ada beberapa hal
    944 penting yang perlu Anda lakukan:</p>
    945 
    946 <ul>
    947   <li>Menetapkan antarmuka pengguna yang akan muncul saat pengguna memilih pengaturan.</li>
    948   <li>Menyimpan nilai pengaturan bila perlu.</li>
    949   <li>Menginisialisasi {@link android.preference.Preference} dengan nilai saat ini (atau default)
    950 bila muncul di tampilan.</li>
    951   <li>Menyediakan nilai default bila diminta oleh sistem.</li>
    952   <li>Jika {@link android.preference.Preference} menyediakan UI sendiri (seperti dialog), simpan
    953 dan pulihkan status untuk menangani perubahan daur hidup (seperti saat pengguna memutar layar).</li>
    954 </ul>
    955 
    956 <p>Bagian berikut menjelaskan cara melakukan setiap tugas ini.</p>
    957 
    958 
    959 
    960 <h3 id="CustomSelected">Menetapkan antarmuka pengguna</h3>
    961 
    962   <p>Jika secara langsung memperluas kelas {@link android.preference.Preference}, Anda perlu mengimplementasikan
    963 {@link android.preference.Preference#onClick()} untuk mendefinisikan tindakan yang terjadi bila pengguna
    964 memilih item tersebut. Akan tetapi, sebagian besar pengaturan custom memperluas {@link android.preference.DialogPreference} untuk
    965 menampilkan dialog, sehingga menyederhanakan prosedur. Bila memperluas {@link
    966 android.preference.DialogPreference}, Anda harus memanggil {@link
    967 android.preference.DialogPreference#setDialogLayoutResource setDialogLayoutResourcs()} selama di
    968 konstruktor kelas untuk menetapkan layout dialog.</p>
    969 
    970   <p>Misalnya, beri ini konstruktor untuk {@link
    971 android.preference.DialogPreference} custom yang mendeklarasikan layout dan menetapkan teks untuk tombol dialog
    972 negatif dan positif default:</p>
    973 
    974 <pre>
    975 public class NumberPickerPreference extends DialogPreference {
    976     public NumberPickerPreference(Context context, AttributeSet attrs) {
    977         super(context, attrs);
    978 
    979         setDialogLayoutResource(R.layout.numberpicker_dialog);
    980         setPositiveButtonText(android.R.string.ok);
    981         setNegativeButtonText(android.R.string.cancel);
    982 
    983         setDialogIcon(null);
    984     }
    985     ...
    986 }
    987 </pre>
    988 
    989 
    990 
    991 <h3 id="CustomSave">Menyimpan nilai pengaturan</h3>
    992 
    993 <p>Anda bisa menyimpan nilai pengaturan kapan saja dengan memanggil salah satu metode {@code persist*()} kelas {@link
    994 android.preference.Preference}, seperti {@link
    995 android.preference.Preference#persistInt persistInt()} jika nilai pengaturan adalah integer atau
    996 {@link android.preference.Preference#persistBoolean persistBoolean()} untuk menyimpan boolean.</p>
    997 
    998 <p class="note"><strong>Catatan:</strong> Setiap {@link android.preference.Preference} hanya bisa menyimpan satu
    999 tipe data, jadi Anda harus menggunakan metode {@code persist*()} yang tepat untuk tipe data yang digunakan
   1000 oleh {@link android.preference.Preference} custom Anda.</p>
   1001 
   1002 <p>Bila Anda memilih untuk mempertahankannya, pengaturan bisa bergantung pada kelas {@link
   1003 android.preference.Preference} yang Anda perluas. Jika Anda memperluas {@link
   1004 android.preference.DialogPreference}, maka Anda harus mempertahankan nilai hanya jika dialog
   1005 tertutup karena hasil positif (pengguna memilih tombol "OK").</p>
   1006 
   1007 <p>Bila {@link android.preference.DialogPreference} tertutup, sistem akan memanggil metode {@link
   1008 android.preference.DialogPreference#onDialogClosed onDialogClosed()}. Metode mencakup argumen
   1009 boolean yang menetapkan apakah hasil pengguna "positif"&mdash;jika nilainya
   1010 <code>true</code>, maka pengguna memilih tombol positif dan Anda harus menyimpan nilai baru. Misalnya:
   1011 </p>
   1012 
   1013 <pre>
   1014 &#64;Override
   1015 protected void onDialogClosed(boolean positiveResult) {
   1016     // When the user selects "OK", persist the new value
   1017     if (positiveResult) {
   1018         persistInt(mNewValue);
   1019     }
   1020 }
   1021 </pre>
   1022 
   1023 <p>Dalam contoh ini, <code>mNewValue</code> adalah anggota kelas yang menampung nilai
   1024 pengaturan saat ini. Memanggil {@link android.preference.Preference#persistInt persistInt()} akan menyimpan nilai
   1025 ke file {@link android.content.SharedPreferences} (secara otomatis menggunakan kunci yang
   1026 ditetapkan dalam file XML untuk {@link android.preference.Preference} ini).</p>
   1027 
   1028 
   1029 <h3 id="CustomInitialize">Menginisialisasi nilai saat ini</h3>
   1030 
   1031 <p>Bila sistem menambahkan {@link android.preference.Preference} Anda ke layar, ia
   1032 akan memanggil {@link android.preference.Preference#onSetInitialValue onSetInitialValue()} untuk memberi tahu
   1033 Anda apakah pengaturan memiliki nilai yang dipertahankan. Jika tidak ada nilai yang dipertahankan, panggilan ini
   1034 akan menyediakan nilai default bagi Anda.</p>
   1035 
   1036 <p>Metode {@link android.preference.Preference#onSetInitialValue onSetInitialValue()} akan meneruskan
   1037 boolean, <code>restorePersistedValue</code>, untuk menunjukkan apakah nilai dipertahankan
   1038 untuk pengaturan. Jika <code>true</code>, maka Anda harus mengambil nilai yang dipertahankan dengan memanggil
   1039 salah satu metode {@code getPersisted*()} kelas {@link
   1040 android.preference.Preference}, seperti {@link
   1041 android.preference.Preference#getPersistedInt getPersistedInt()} untuk nilai integer. Anda biasanya
   1042 perlu mengambil nilai yang dipertahankan agar bisa memperbarui UI dengan benar untuk merefleksikan
   1043 nilai yang tersimpan sebelumnya.</p>
   1044 
   1045 <p>Jika <code>restorePersistedValue</code> adalah <code>false</code>, maka Anda
   1046 harus menggunakan nilai default yang diteruskan dalam argumen kedua.</p>
   1047 
   1048 <pre>
   1049 &#64;Override
   1050 protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
   1051     if (restorePersistedValue) {
   1052         // Restore existing state
   1053         mCurrentValue = this.getPersistedInt(DEFAULT_VALUE);
   1054     } else {
   1055         // Set default state from the XML attribute
   1056         mCurrentValue = (Integer) defaultValue;
   1057         persistInt(mCurrentValue);
   1058     }
   1059 }
   1060 </pre>
   1061 
   1062 <p>Setiap metode {@code getPersisted*()} memerlukan argumen yang menetapkan
   1063 nilai default untuk digunakan jika tidak ada nilai yang dipertahankan atau kunci tidak ada. Dalam contoh
   1064 di atas, konstanta lokal yang digunakan untuk menetapkan nilai default dalam kasus {@link
   1065 android.preference.Preference#getPersistedInt getPersistedInt()} tidak bisa mengembalikan nilai yang dipertahankan.</p>
   1066 
   1067 <p class="caution"><strong>Perhatian:</strong> Anda <strong>tidak bisa</strong> menggunakan
   1068 <code>defaultValue</code> sebagai nilai default dalam metode {@code getPersisted*()}, karena
   1069 nilainya selalu nol bila <code>restorePersistedValue</code> adalah <code>true</code>.</p>
   1070 
   1071 
   1072 <h3 id="CustomDefault">Menyediakan nilai default</h3>
   1073 
   1074 <p>Jika instance kelas {@link android.preference.Preference} Anda menetapkan nilai default
   1075 (dengan atribut {@code android:defaultValue}), maka
   1076 sistem akan memanggil {@link android.preference.Preference#onGetDefaultValue
   1077 onGetDefaultValue()} bila membuat instance objek untuk mengambil nilai. Anda harus mengimplementasikan
   1078 metode ini agar sistem bisa menyimpan nilai default dalam {@link
   1079 android.content.SharedPreferences}. Misalnya:</p>
   1080 
   1081 <pre>
   1082 &#64;Override
   1083 protected Object onGetDefaultValue(TypedArray a, int index) {
   1084     return a.getInteger(index, DEFAULT_VALUE);
   1085 }
   1086 </pre>
   1087 
   1088 <p>Argumen metode menyediakan semua hal yang Anda perlukan: larik atribut dan posisi
   1089 indeks dari {@code android:defaultValue}, yang harus Anda ambil. Alasan Anda harus
   1090 mengimplementasikan metode ini untuk mengekstrak nilai default dari atribut adalah karena Anda harus menetapkan
   1091 nilai default lokal untuk atribut jika nilai tidak didefinisikan.</p>
   1092 
   1093 
   1094 
   1095 <h3 id="CustomSaveState">Menyimpan dan memulihkan status Preferensi</h3>
   1096 
   1097 <p>Seperti halnya {@link android.view.View} di layout, subkelas {@link android.preference.Preference}
   1098 Anda bertanggung jawab menyimpan dan memulihkan statusnya jika aktivitas atau fragmen
   1099 di-restart (seperti saat pengguna memutar layar). Untuk menyimpan
   1100 dan memulihkan status kelas {@link android.preference.Preference} dengan benar, Anda harus mengimplementasikan
   1101 metode callback daur hidup {@link android.preference.Preference#onSaveInstanceState
   1102 onSaveInstanceState()} dan {@link
   1103 android.preference.Preference#onRestoreInstanceState onRestoreInstanceState()}.</p>
   1104 
   1105 <p>Status {@link android.preference.Preference} Anda didefinisikan oleh objek yang mengimplementasikan
   1106 antarmuka {@link android.os.Parcelable}. Kerangka kerja Android menyediakan objek seperti itu untuk Anda gunakan
   1107 sebagai titik mulai untuk mendefinisikan objek status Anda: kelas {@link
   1108 android.preference.Preference.BaseSavedState}.</p>
   1109 
   1110 <p>Untuk mendefinisikan cara kelas {@link android.preference.Preference} menyimpan statusnya, Anda harus
   1111 memperluas kelas {@link android.preference.Preference.BaseSavedState}. Anda hanya perlu mengesampingkan
   1112  beberapa metode dan mendefinisikan objek {@link android.preference.Preference.BaseSavedState#CREATOR}
   1113 .</p>
   1114 
   1115 <p>Untuk sebagian besar aplikasi, Anda bisa menyalin implementasi berikut dan cukup mengubah baris yang
   1116 menangani {@code value} jika subkelas {@link android.preference.Preference} Anda menyimpan tipe
   1117 data selain integer.</p>
   1118 
   1119 <pre>
   1120 private static class SavedState extends BaseSavedState {
   1121     // Member that holds the setting's value
   1122     // Change this data type to match the type saved by your Preference
   1123     int value;
   1124 
   1125     public SavedState(Parcelable superState) {
   1126         super(superState);
   1127     }
   1128 
   1129     public SavedState(Parcel source) {
   1130         super(source);
   1131         // Get the current preference's value
   1132         value = source.readInt();  // Change this to read the appropriate data type
   1133     }
   1134 
   1135     &#64;Override
   1136     public void writeToParcel(Parcel dest, int flags) {
   1137         super.writeToParcel(dest, flags);
   1138         // Write the preference's value
   1139         dest.writeInt(value);  // Change this to write the appropriate data type
   1140     }
   1141 
   1142     // Standard creator object using an instance of this class
   1143     public static final Parcelable.Creator&lt;SavedState> CREATOR =
   1144             new Parcelable.Creator&lt;SavedState>() {
   1145 
   1146         public SavedState createFromParcel(Parcel in) {
   1147             return new SavedState(in);
   1148         }
   1149 
   1150         public SavedState[] newArray(int size) {
   1151             return new SavedState[size];
   1152         }
   1153     };
   1154 }
   1155 </pre>
   1156 
   1157 <p>Dengan implementasi {@link android.preference.Preference.BaseSavedState} di atas yang ditambahkan
   1158 ke aplikasi Anda (biasanya sebagai subkelas dari subkelas {@link android.preference.Preference}), Anda
   1159 nanti perlu mengimplementasikan metode {@link android.preference.Preference#onSaveInstanceState
   1160 onSaveInstanceState()} dan {@link
   1161 android.preference.Preference#onRestoreInstanceState onRestoreInstanceState()} untuk subkelas
   1162 {@link android.preference.Preference} Anda.</p>
   1163 
   1164 <p>Misalnya:</p>
   1165 
   1166 <pre>
   1167 &#64;Override
   1168 protected Parcelable onSaveInstanceState() {
   1169     final Parcelable superState = super.onSaveInstanceState();
   1170     // Check whether this Preference is persistent (continually saved)
   1171     if (isPersistent()) {
   1172         // No need to save instance state since it's persistent,
   1173         // use superclass state
   1174         return superState;
   1175     }
   1176 
   1177     // Create instance of custom BaseSavedState
   1178     final SavedState myState = new SavedState(superState);
   1179     // Set the state's value with the class member that holds current
   1180     // setting value
   1181     myState.value = mNewValue;
   1182     return myState;
   1183 }
   1184 
   1185 &#64;Override
   1186 protected void onRestoreInstanceState(Parcelable state) {
   1187     // Check whether we saved the state in onSaveInstanceState
   1188     if (state == null || !state.getClass().equals(SavedState.class)) {
   1189         // Didn't save the state, so call superclass
   1190         super.onRestoreInstanceState(state);
   1191         return;
   1192     }
   1193 
   1194     // Cast state to custom BaseSavedState and pass to superclass
   1195     SavedState myState = (SavedState) state;
   1196     super.onRestoreInstanceState(myState.getSuperState());
   1197 
   1198     // Set this Preference's widget to reflect the restored state
   1199     mNumberPicker.setValue(myState.value);
   1200 }
   1201 </pre>
   1202 
   1203