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 <CheckBoxPreference>}.</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 <PreferenceScreen>}. Dalam elemen inilah tempat Anda menambahkan setiap {@link 197 android.preference.Preference}. Setiap anak yang Anda tambahkan dalam elemen 198 {@link android.preference.PreferenceScreen <PreferenceScreen>} akan tampak sebagai item 199 tunggal dalam daftar pengaturan.</p> 200 201 <p>Misalnya:</p> 202 203 <pre> 204 <?xml version="1.0" encoding="utf-8"?> 205 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 206 <CheckBoxPreference 207 android:key="pref_sync" 208 android:title="@string/pref_sync" 209 android:summary="@string/pref_sync_summ" 210 android:defaultValue="true" /> 211 <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 </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 <intent>}</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 <PreferenceCategory>}. <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 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 288 <PreferenceCategory 289 android:title="@string/pref_sms_storage_title" 290 android:key="pref_key_storage_settings"> 291 <CheckBoxPreference 292 android:key="pref_key_auto_delete" 293 android:summary="@string/pref_summary_auto_delete" 294 android:title="@string/pref_title_auto_delete" 295 android:defaultValue="false"... /> 296 <Preference 297 android:key="pref_key_sms_delete_limit" 298 android:dependency="pref_key_auto_delete" 299 android:summary="@string/pref_summary_delete_limit" 300 android:title="@string/pref_title_sms_delete"... /> 301 <Preference 302 android:key="pref_key_mms_delete_limit" 303 android:dependency="pref_key_auto_delete" 304 android:summary="@string/pref_summary_delete_limit" 305 android:title="@string/pref_title_mms_delete" ... /> 306 </PreferenceCategory> 307 ... 308 </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 <PreferenceScreen>} 321 membuat item yang, bila dipilih, akan membuka daftar terpisah untuk menampilkan pengaturan tersarang.</p> 322 323 <p>Misalnya:</p> 324 325 <pre> 326 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 327 <!-- opens a subscreen of settings --> 328 <PreferenceScreen 329 android:key="button_voicemail_category_key" 330 android:title="@string/voicemail" 331 android:persistent="false"> 332 <ListPreference 333 android:key="button_voicemail_provider_key" 334 android:title="@string/voicemail_provider" ... /> 335 <!-- opens another nested subscreen --> 336 <PreferenceScreen 337 android:key="button_voicemail_setting_key" 338 android:title="@string/voicemail_settings" 339 android:persistent="false"> 340 ... 341 </PreferenceScreen> 342 <RingtonePreference 343 android:key="button_voicemail_ringtone_key" 344 android:title="@string/voicemail_ringtone_title" 345 android:ringtoneType="notification" ... /> 346 ... 347 </PreferenceScreen> 348 ... 349 </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 <intent>} 358 sebagai anak dari elemen {@code <Preference>} yang bersangkutan.</p> 359 360 <p>Misalnya, berikut ini cara menggunakan item preferensi untuk membuka halaman web:</p> 361 362 <pre> 363 <Preference android:title="@string/prefs_web_page" > 364 <intent android:action="android.intent.action.VIEW" 365 android:data="http://www.example.com" /> 366 </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 @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,—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 @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 @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 <!-- default value is a boolean --> 500 <CheckBoxPreference 501 android:defaultValue="true" 502 ... /> 503 504 <!-- default value is a string --> 505 <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—dan dalam aktivitas lainnya yang digunakan pengguna untuk masuk ke aplikasi Anda untuk pertama kali 512 —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 <header>} 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 <header>} 586 tunggal dalam elemen {@code <preference-headers>} akar. Misalnya:</p> 587 588 <pre> 589 <?xml version="1.0" encoding="utf-8"?> 590 <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> 591 <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 <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 <!-- key/value pairs can be included as arguments for the fragment. --> 600 <extra android:name="someKey" android:value="someHeaderValue" /> 601 </header> 602 </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 <extras>} 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 <extra>} dengan kunci {@code "settings"}:</p> 617 618 <pre> 619 public static class SettingsFragment extends PreferenceFragment { 620 @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 @Override 646 public void onBuildHeaders(List<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 <Preference>} 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 <Preference>} 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 <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> 679 <header 680 android:fragment="com.example.prefs.SettingsFragmentOne" 681 android:title="@string/prefs_category_one" 682 android:summary="@string/prefs_summ_category_one" /> 683 <header 684 android:fragment="com.example.prefs.SettingsFragmentTwo" 685 android:title="@string/prefs_category_two" 686 android:summary="@string/prefs_summ_category_two" /> 687 </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 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 695 <Preference 696 android:title="@string/prefs_category_one" 697 android:summary="@string/prefs_summ_category_one" > 698 <intent 699 android:targetPackage="com.example.prefs" 700 android:targetClass="com.example.prefs.SettingsActivity" 701 android:action="com.example.prefs.PREFS_ONE" /> 702 </Preference> 703 <Preference 704 android:title="@string/prefs_category_two" 705 android:summary="@string/prefs_summ_category_two" > 706 <intent 707 android:targetPackage="com.example.prefs" 708 android:targetClass="com.example.prefs.SettingsActivity" 709 android:action="com.example.prefs.PREFS_TWO" /> 710 </Preference> 711 </PreferenceScreen> 712 </pre> 713 714 <p>Karena dukungan untuk {@code <preference-headers>} 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 @Override 725 public void onCreate(Bundle savedInstanceState) { 726 super.onCreate(savedInstanceState); 727 ... 728 729 if (Build.VERSION.SDK_INT < 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 @Override 737 public void onBuildHeaders(List<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 <intent>} XML preferensi:</p> 745 746 <pre> 747 final static String ACTION_PREFS_ONE = "com.example.prefs.PREFS_ONE"; 748 ... 749 750 @Override 751 public void onCreate(Bundle savedInstanceState) { 752 super.onCreate(savedInstanceState); 753 754 String action = getIntent().getAction(); 755 if (action != null && action.equals(ACTION_PREFS_ONE)) { 756 addPreferencesFromResource(R.xml.preferences); 757 } 758 ... 759 760 else if (Build.VERSION.SDK_INT < 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 @Override 846 protected void onResume() { 847 super.onResume(); 848 getPreferenceScreen().getSharedPreferences() 849 .registerOnSharedPreferenceChangeListener(this); 850 } 851 852 @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 <activity android:name="SettingsActivity" ... > 916 <intent-filter> 917 <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /> 918 <category android:name="android.intent.category.DEFAULT" /> 919 </intent-filter> 920 </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"—jika nilainya 1010 <code>true</code>, maka pengguna memilih tombol positif dan Anda harus menyimpan nilai baru. Misalnya: 1011 </p> 1012 1013 <pre> 1014 @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 @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 @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 @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<SavedState> CREATOR = 1144 new Parcelable.Creator<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 @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 @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