Membuat Halaman Settings di Android Menggunakan PreferenceFragment

Bagus Aji Santoso 23 Oktober 2017

Membuat Halaman Settings di Android Menggunakan PreferenceFragment

Pendahuluan

Biasanya di aplikasi Android kita sering melihat halaman settings yang memiliki opsi untuk mengatur bagaimana suatu aplikasi bekerja. PreferenceFragment dan PreferenceFragmentCompat memiliki kumpulan hirarki dari kumpulan objek preference yang ditampilkan dalam bentuk list di layar. Preferences yang ditampilkan tadi dapat disimpan secara otomatis ke SharedPreferences.

Minimum API Level

Lollipop ke bawah: Cara yang paling disarankan untuk menangani halaman settings ialah menggunakan PreferenceFragment yang mana mendukung API level 11 (Honeycomb) ke atas. Pembaca dapat menghindari PreferenceActivity yang sudah memiliki banyak method deprecated. Ingat bahwa PreferenceFragment tidak kompatibel dengan Android support v4. Alternatif lain:

Marshmallow ke atas: Library support v7 mengenalkan PreferenceFragmentCompat. Kita akan menggunakannya di tutorial ini.

Atur Dependensi Gradle

Buka file app/build.gradle dan tambahkan baris berikut ke blok dependensi:

dependencies {
    // your other dependencies...
    compile 'com.takisoft.fix:preference-v7:25.3.0.0'
}

Karena adanya bug saat menggunakan tema Material Design dengan Preference Fragment Compat, maka kita akan menggunakan library open source pihak ke tiga. Baca diskusinya di StackOverflow.

Buat File XML

Pertama, buat objek XML baru di res/xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
   
    <PreferenceCategory
        android:title="@string/title_first_section">
 
        <CheckBoxPreference
            android:key="checkbox_preference"
            android:title="@string/title_checkbox_preference"
            android:defaultValue="@string/default_checkbox_preference"/>
            
        <EditTextPreference
            android:key="edittext_preference"
            android:title="@string/title_edittext_preference"
            android:summary="@string/summary_edittext_preference"
            android:dialogTitle="@string/dialog_title_edittext_preference"
            android:dependency="checkbox_preference" />
 
        </PreferenceCategory>
 
    <PreferenceCategory
        android:title="@string/title_second_section">
 
        <ListPreference
            android:key="list_preference"
            android:title="@string/title_list_preference"
            android:dialogTitle="@string/dialog_title_list_preference"
            android:entries="@array/entries_list_preference"
            android:entryValues="@array/entryvalues_list_preference" />
 
        <Preference
            android:title="@string/title_intent_preference">
            <intent android:action="android.intent.action.VIEW"
                android:data="http://codepath.com/" />
        </Preference>
 
        </PreferenceCategory>
 
</PreferenceScreen>

Semua preferences disimpan sebagai pasangan key-value di SharedPreferences menggunakan key yang kita tentukan di atas (android:key). Untuk mendapatkan objek preferences yang bisa mengambil value dari key di atas kita dapat menggunakan kode berikut:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(android.content.Context);

Elemen paling luar dari file XML ini harus berupa . Di dalam screen ini kita dapat melihat semua preferences atau preferences yang di kelompokkan di dalam . Preferences yang dikelompokkan akan tampil bersama di bawah sebuah section heading. Berikut hasil dari kode di atas:

Image

Preference Types

Ada beberapa tiep preferences yang dipakai untuk settings:

  • ListPreference: membuka sebuah dialog yang menampilkan daftar opsi; menyimpan data bertipe string
  • EditTextPreference: membuka dialog dengan sebuah EditText untuk menerima masukan; menyimpan data bertipe string
  • CheckBoxPreference: menggunakan checkbox untuk menyimpan data bertipe boolean (true saat dicentang, false saat centang dihilangkan)
  • SwitchPreference (min API 14): menggunakan sebuah switch untuk menyimpan data bertipe boolean (true saat on, false saat off)

Dua tiep di atas (ListPreference and EditTextPreference) diturunkan dari DialogPreference dan dapat menambahkan atribut yang berhubungan dengan dialogdi XML (e.g. a dialogTitle).

Menambah Opsi Untuk ListPreference

Saat membuat opsi untuk ListPreferences kita memerlukan dua array. Yang pertama di simpan di dalam android:entries yang merupakan array berisi string untuk ditampilkan ke pengguna. Array yang kedua berisi nilai untuk masing-masing opsi tersebut yang disimpan di android:entryValues (contoh array dapat dilihat di sini).

  <ListPreference
      android:key="list_preference"
      android:title="@string/title_list_preference"
      android:dialogTitle="@string/dialog_title_list_preference"
      android:entries="@array/entries_list_preference"
      android:entryValues="@array/entryvalues_list_preference" />

Intent di Preferences

Preferenes dapat menyimpan suatu intent yang bias digunakan untuk membuka activity baru atau melakukan aksi seputar intent lainnya. Tidak ada data yang disimpan di intent tersebut.

  <Preference
      android:title="@string/title_intent_preference">
      <intent android:action="android.intent.action.VIEW"
          android:data="http://codepath.com/" />
  </Preference>

Implementasi Java

Gunakan PreferenceFragmentCompat untuk menangani preferences lewat Java. Untuk membaca settings di dalam fragment, baca preferences di dalam methodonCreatePreferences(). Untuk mengambil objek preference, gunakan method getPreferenceManager().findPreference("key"). Untuk mengubah-ubah isi settings menggunakan objek preference barusan, buat sebuah OnPreferenceChangeListener.

public class SettingsFragment extends PreferenceFragmentCompat {
    
    private ListPreference mListPreference;
    
    ...
    
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        // Indicate here the XML resource you created above that holds the preferences
        setPreferencesFromResource(R.xml.settings, rootKey);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        
        mListPreference = (ListPreference)  getPreferenceManager().findPreference("preference_key");
        mListPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                // your code here
            }
        }
        
        return inflater.inflate(R.layout.fragment_settings, container, false);
    }
}

Custom Preferences

Jika contoh di atas tidak sesuai dengan kebutuhan yang pembaca cari, pembaca juga dapat membuat sebuah custom preference yang meng-extend dari DialogPreference, TwoStatePreference, atau Preference.

Untuk panduan lengkap bagaimana membuat custom preference, kunjungi Android Developer: Settings API.

Diterjemahkan dari Settings with PreferenceFragmentEdit PagePage History