9.2: Menambahkan Setelan ke Aplikasi

Daftar Isi:

Aplikasi sering kali menyertakan setelan yang memungkinkan pengguna memodifikasi fitur dan perilaku aplikasi. Misalnya, beberapa aplikasi memungkinkan pengguna menyetel lokasi rumahnya, unit default untuk pengukuran, opsi makan malam, dan setelan lain yang berlaku pada seluruh aplikasi. Setelan biasanya tidak sering diakses, karena sekali pengguna mengubah setelan, seperti lokasi rumah, pengguna jarang perlu kembali dan mengubahnya lagi.

Pengguna mengharapkan masuk ke pengaturan aplikasi dengan mengetuk Settings di navigasi samping, seperti panel samping navigasi seperti yang ditampilkan di sebelah kiri gambar di bawah, atau di menu opsi di bilah aplikasi, yang ditampilkan di sebelah kanan gambar di bawah. Masuk ke Settings dari Panel Samping Navigasi (kiri) atau Menu Opsi (kanan)

Dalam gambar di atas:

  1. Settings di navigasi samping (panel samping navigasi)
  2. Settings* di menu opsi bilah aplikasi

Dalam praktik ini Anda akan menambahkan aktivitas setelan ke aplikasi. Pengguna akan bisa masuk ke setelan aplikasi dengan mengetuk Settings, yang akan ditempatkan di menu opsi di bilah aplikasi.

Yang harus sudah Anda KETAHUI

Dari praktik sebelumnya, Anda harus sudah bisa:

  • Menambahkan aktivitas ke aplikasi.
  • Merancang layout dengan tombol dan tampilan teks.
  • Mengekstrak sumber daya string dan mengedit nilai string dan larik string.
  • Membuat menu opsi di bilah aplikasi.
  • Menambahkan dan mengedit item menu di menu opsi.
  • Menambahkan handler kejadian untuk klik item menu.
  • Mengedit file AndroidManifest.xml untuk menambahkan navigasi naik untuk aktivitas kedua.
  • Membaca preferensi dari sharedPreferences.

Yang akan Anda PELAJARI

Anda akan belajar:

  • Menambahkan aktivitas dan memahami penggunaan fragmen untuk mengelola setelan.
  • Membuat file sumber daya XML setelan dengan atributnya.
  • Membuat navigasi ke aktivitas setelan.
  • Menyetel nilai default setelan.
  • Membaca nilai setelan yang diubah oleh pengguna.
  • Menyesuaikan template Settings Activity untuk Anda gunakan sendiri.

Yang akan Anda LAKUKAN

Dalam praktik ini Anda akan:

  • Membuat aplikasi yang menyertakan Settings* di menu opsi.
  • Menambahkan "Opsi Setelan" sebagai tombol alih.
  • Menambahkan kode untuk menyetel nilai default untuk setelan dan mengakses nilai setelan setelah diubah.
  • Menggunakan dan menyesuaikan template Settings Activity Android Studio.

Ringkasan aplikasi

Android Studio menyediakan pintasan untuk menyiapkan menu opsi dengan Settings. Jika Anda memulai proyek Android Studio untuk ponsel cerdas atau tablet menggunakan template Basic Activity, aplikasi baru menyertakan Settings seperti yang ditampilkan di bawah ini: Aplikasi Dibuat dari Template Basic Activity

Template juga menyertakan tombol aksi mengambang di sudut kanan bawah layar dengan ikon amplop. Anda bisa mengabaikan tombol ini untuk praktik ini, karena Anda tidak akan menggunakannya.

Anda akan memulai dengan membuat aplikasi yang bernama AppWithSettings menggunakan template Basic Activity, dan menambahkan aktivitas setelan yang menyediakan satu setelan tombol alih yang bisa diaktifkan atau dinonaktifkan pengguna: Aktivitas Setelan dengan Satu Setelan

Anda akan menambahkan kode untuk membaca setelan dan melakukan tindakan berdasarkan nilainya. Agar sederhana, tindakan akan menampilkan pesan toast dengan nilai setelan.

Dalam tugas kedua, Anda akan menambahkan template Settings Activity standar yang disediakan oleh Android Studio ke aplikasi DroidCafe yang telah Anda buat di pelajaran sebelumnya. Template Settings Activity sudah diisi terlebih dulu dengan setelan yang bisa Anda sesuaikan untuk aplikasi, dan menyesuaikan layout yang berbeda untuk ponsel cerdas dan tablet:

  • Ponsel cerdas: Layar Settings utama dengan tautan header untuk setiap grup setelan, seperti General untuk setelan umum, seperti yang ditampilkan di bawah ini. Menu Opsi dengan Setelan (kiri)

  • Tablet: Layout layar detail/master dengan tautan header untuk setiap grup di sebelah kiri (master), dan grup setelan di sebelah kanan (detail), seperti yang ditampilkan dalam gambar di bawah ini. Setelan Umum di Tablet di Layar Master/Detail

Yang perlu Anda lakukan untuk menyesuaikan template adalah mengubah header, judul setelan, deskripsi setelan, dan nilai untuk setelan dan menulis kode yang biasa Anda tulis untuk menggunakan nilai setelan.

Aplikasi Droid Cafe dibuat di pelajaran sebelumnya dari template Basic Activity, yang menyediakan menu opsi di bilah aplikasi untuk menempatkan opsi Settings. Anda akan menyesuaikan template Settings Activity yang disediakan dengan mengubah satu judul, keterangan, nilai, dan nilai default setelan. Anda akan menambahkan kode untuk membaca nilai setelan setelah pengguna mengubahnya dan menampilkan nilai tersebut.

Tugas 1: Menambahkan setelan pengalihan ke aplikasi

Dalam tugas ini, Anda akan:

  • Membuat proyek baru berdasarkan template Basic Activity (yang menyediakan menu opsi).
  • Menambahkan setelan tombol alih dengan atribut di file XML preferensi.
  • Menambahkan aktivitas untuk setelan dan fragmen untuk setelan khusus. akan menggunakan versi PreferenceFragmentCompat PreferenceFragment untuk mempertahankan kompatibilitas dengan AppCompatActivity. Anda juga akan menambahkan pustaka android.support:preference-v7.
  • Menghubungkan item Settings di menu opsi ke aktivitas setelan.

1.1. Membuat proyek dan menambahkan direktori xml dan file sumber daya

  1. Di Android Studio, buatlah proyek baru dengan parameter berikut:

    Atribut

    Nilai

    Application Name

    AppWithSettings

    Company Name

    android.example.com (atau domain Anda sendiri)

    Phone and Tablet Minimum SDK

    API15: Android 4.0.3 IceCreamSandwich

    Use a Fragment?

    Jangan dicentang

    Template

    Basic Activity

  2. Jalankan aplikasi dan ketuk ikon luapan di bilah aplikasi untuk melihat menu opsi, seperti yang ditampilkan dalam gambar di bawah ini. Satu-satunya item di menu opsi adalah Settings. Mengetuk Menu Opsi
  3. Buat direktori sumber daya baru untuk menampung file XML yang berisi setelan:
    1. Pilih direktori res di tampilan Project: Android, dan pilih File > New > Android Resource Directory. Dialog New Resource Directory akan muncul.
    2. Di menu tarik-turun tipe Resource, pilih xml. Nama Direktori otomatis berubah menjadi xml.
    3. Klik OK.
  4. Direktori xml muncul di tampilan Project: Android di dalam direktori res. Pilih direktori xml dan pilih File > New > XML resource file (atau klik kanan direktori xml dan pilih New > XML resource file).
  5. Masukkan nama file XML, preferences, di bidang nama File dan klik OK. File preferences.xml muncul di dalam direktori xml dan editor layout muncul, seperti yang ditampilkan dalam gambar di bawah ini. Editor Layout untuk Preferences.xml

Dalam gambar di atas:

  1. File preferences.xml di dalam direktori xml.
  2. Editor layout menampilkan konten preferences.xml.

1.2 Tambahkan preferensi XML dan atribut untuk setelan.

  1. Seret SwitchPreference dari panel Palette di sebelah kiri ke atas layout, seperti yang ditampilkan dalam gambar di bawah ini. Menyeret SwitchPreference ke dalam Layout

  2. Ubah nilai di panel Properties di sebelah kanan editor layout seperti berikut (lihat gambar di bawah):

    1. defaultValue: true
    2. key:example_switch
    3. title: Settings option
    4. summary: Turn this option on or off Menyeret SwitchPreference ke dalam Layout
  3. Klik tab Text di bawah editor layout untuk mengedit kode XML:

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
       <SwitchPreference
          android:defaultValue="true"
          android:title="Settings option"
          android:key="example_switch"
          android:summary="Turn this option on or off" />
    </PreferenceScreen>
    

    Nilai Properties yang Anda masukkan merepresentasikan atribut XML:

    • android:defaultValue: Nilai default setelan saat aplikasi dimulai pertama kali.
    • android:title: Judul setelan. Untuk SwitchPreference, judul muncul di sebelah kiri tombol alih.
    • android:key: Kunci yang digunakan untuk menyimpan nilai setelan. Setiap setelan memiliki pasangan nilai-kunci yang sesuai yang digunakan sistem untuk menyimpan setelan dalam file SharedPreferences default untuk setelan aplikasi Anda.
    • android:summary: Rangkuman teks muncul di bawah setelan.
  4. Ekstrak sumber daya string untuk nilai atribut android:title dan android:summary menjadi @string/switch_title dan @string/switch_summary.

  5. Ubah <SwitchPreference dalam kode ke <android.support.v7.preference.SwitchPreferenceCompat:

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
       <android.support.v7.preference.SwitchPreferenceCompat
          ... />
    </PreferenceScreen>
    

    Untuk menggunakan versi PreferenceFragmentCompat dari PreferenceFragment, Anda juga harus menggunakan versi android.support.v7 dari SwitchPreference (SwitchPreferenceCompat).

    Baris SwitchPreferenceCompat di atas mungkin menampilkan ikon bola lampu kuning dengan peringatan, tetapi Anda bisa mengabaikannya.

  6. Bukan file styles.xml dan tambahkan deklarasi preferenceTheme berikut ke AppTheme:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
       ...
       <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
    </style>
    

    Untuk menggunakan versi PreferenceFragmentCompat dari PreferenceFragment, Anda juga harus mendeklarasikan preferenceTheme dengan gaya PreferenceThemeOverlay ke tema aplikasi.

  7. Buka file **build.gradle (Module: app), dan tambahkan yang berikut ini ke bagian dependencies:
    dependencies {
       ...
       compile 'com.android.support:preference-v7:25.0.1'
    }
    

Hal di atas menambahkan pustaka android.support:preference-v7 untuk menggunakan versi PreferenceFragmentCompat dari PreferenceFragment.

1.3 Tambahkan aktivitas untuk setelan dan fragmen untuk setelan yang spesifik

  1. Untuk membuat aktivitas Settings yang menyediakan UI untuk setelan, tambahkan Empty Activity ke aplikasi:

    1. Pilih app di bagian atas Project: Android.
    2. Pilih New > Activity > Empty Activity.
    3. Beri nama aktivitas SettingsActivity.
    4. Hapus centang opsi untuk menghasilkan file layout (Anda tidak memerlukannya).
    5. Biarkan opsi Backwards Compatibility (AppCompat) dicentang.
    6. Nama paket harus sudah disetel ke com.example.android.projectname, dan Target Source Set harus disetel ke main. Jika tidak, buat pilihan ini di menu tarik-turun.
    7. Klik Finish.

    Hasilnya adalah definisi kelas berikut di SettingsActivity:

        public class SettingsActivity extends AppCompatActivity {
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
            }
        }
    
  2. Tambahkan fragmen kosong untuk grup setelan yang sama (tanpa layout, metode bawaan, atau callback antarmuka) ke aplikasi, untuk menukarnya ke dalam layar aktivitas Settings jika diperlukan:

    1. Pilih app di bagian atas tampilan Project: Android lagi.
    2. Pilih New > Fragment > Fragment (Blank).
    3. Beri nama fragmen SettingsFragment.
    4. Hapus centang opsi untuk menghasilkan file layout (Anda tidak memerlukannya).
    5. Hapus centang opsi untuk menyertakan metode bawaan fragmen.
    6. Hapus centang opsi untuk menyertakan callback antarmuka.
    7. Klik Finish.

    Hasilnya adalah definisi kelas berikut di SettingsFragment:

        public class SettingsFragment extends Fragment {
    
            public SettingsFragment() {
                // Required empty public constructor
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater,
                              ViewGroup container, Bundle savedInstanceState) {
                TextView textView = new TextView(getActivity());
                textView.setText(R.string.hello_blank_fragment);
                return textView;
            }
        }
    
  3. Ubah definisi kelas SettingsFragment untuk memperluas PreferenceFragmentCompat:

    public class SettingsFragment extends PreferenceFragmentCompat {
    ...
    }
    

    Anda menggunakan subkelas Fragment yang khusus untuk menampilkan daftar setelan. Praktik terbaiknya adalah menggunakan Aktivitas rutin yang meng-host PreferenceFragment yang menampilkan setelan aplikasi. Fragmen seperti PreferenceFragment menyediakan arsitektur yang lebih fleksibel untuk aplikasi Anda dibandingkan dengan hanya menggunakan aktivitas. Fragmen mirip dengan bagian modular sebuah aktivitas—fragmen memiliki daur hidupnya sendiri dan menerima kejadian masukannya sendiri, dan bisa menambahkan atau membuang fragmen saat aktivitas sedang berjalan.

    Gunakan versi PreferenceFragmentCompat dari PreferenceFragment dengan aktivitas yang memperluas AppCompatActivity. Untuk memperluas fragmen, Anda mungkin harus menambahkan pernyataan import berikut:

    import android.support.v7.preference.PreferenceFragmentCompat;
    
  4. Ganti seluruh metode onCreateView() di fragmen dengan metode onCreate() ini:

          @Override
          public void onCreatePreferences(Bundle savedInstanceState,
              String rootKey) {
          }
    

    Alasan mengapa Anda mengganti onCreateView() dengan onCreatePreferences() di SettingsFragment adalah Anda akan menambahkan fragmen ini ke SettingsActivity yang sudah ada untuk menampilkan preferensi, bukan menampilkan layar fragmen yang terpisah. Menambahkannya ke aktivitas yang sudah ada memudahkan Anda menambahkan atau membuang fragmen saat aktivitas sedang berjalan. Fragmen preferensi di-root di PreferenceScreen menggunakan rootKey.

    Anda bisa dengan aman membuang constructor kosong dari fragmen, karena fragmen tidak ditampilkan sendiri:

    public SettingsFragment() {
            // Required empty public constructor
          }
    
  5. Di akhir metode onCreatePreferences() di SettingsFragment, Anda perlu mengaitkan sumber daya setelan preferences.xml yang baru saja Anda buat dengan fragmen ini. Tambahkan sebuah panggilan ke setPreferencesFromResource dengan meneruskan id file XML (R.xml.preferences)) dan rootKey untuk mengidentifikasi root preferensi di PreferenceScreen:

    setPreferencesFromResource(R.xml.preferences, rootKey);
    

    Metode onCreatePreferences() sekarang harus terlihat seperti ini:

    @Override
    public void onCreatePreferences(Bundle savedInstanceState,
                                    String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
    
  6. Tambahkan kode berikut ke akhir metode onCreate() SettingsActivity sehingga fragmen ditampilkan sebagai konten utama:

    getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new SettingsFragment())
                    .commit();
    

    Kode di atas adalah pola umum yang digunakan untuk menambahkan fragmen ke sebuah aktivitas sehingga fragmen muncul sebagai konten utama aktivitas. Anda menggunakan:

    • getFragmentManager() jika kelas memperluas Activity dan fragmen memperluas PreferenceFragment.
    • getSupportFragmentManager() jika kelas memperluas AppCompatActivity dan fragmen memperluas PreferenceFragmentCompat.

    Seluruh metode onCreate() di SettingsActivity sekarang harus terlihat seperti berikut:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new SettingsFragment())
                    .commit();
    }
    

1.4 Hubungkan item menu Settings ke aktivitas setelan

Gunakan intent untuk meluncurkan SettingsActivity dari MainActivity.

  1. Temukan blok if di metode onOptionsItemSelected() di MainActivity yang menangani ketukan pada Settings di menu opsi:
    if (id == R.id.action_settings) {
       return true;
    }
    
  2. Tambahkan intent ke blok if untuk meluncurkan SettingsActivity:
    if (id == R.id.action_settings) {
       Intent intent = new Intent(this, SettingsActivity.class);
       startActivity(intent);
       return true;
    }
    
  3. Tambahkan navigasi tombol Up ke SettingsActivity dengan mengedit deklarasinya di file AndroidManifest.xml untuk mendefinisikan induk aktivitas sebagai MainActivity.
    1. Temukan deklarasi SettingsActivity di AndroidManifest.xml:
      <activity android:name=".SettingsActivity"></activity>
      
    2. Ubah deklarasi menjadi yang berikut ini:
      <activity android:name=".SettingsActivity"
          android:label="Settings"
          android:parentActivityName=".MainActivity">
          <meta-data
              android:name="android.support.PARENT_ACTIVITY"
              android:value=".MainActivity"/>
      </activity>
      
  4. Jalankan aplikasi. Ketuk ikon luapan untuk menu opsi (seperti yang ditampilkan di sebelah kiri gambar di bawah) dan ketuk Settings untuk melihat aktivitas setelan (seperti yang ditampilkan di tengah gambar di bawah). Ketuk tombol Naik di bilah aplikasi pada aktivitas setelan, yang ditampilkan di sebelah kanan gambar di bawah, untuk kembali ke aktivitas utama. Mengetuk Settings untuk masuk ke Settings Activity

1.5 Simpan nilai default di preferensi bersama

Meskipun nilai default untuk setelan tombol alih telah disetel di atribut android:defaultValue (di Langkah 1.2 tugas ini), aplikasi harus menyimpan nilai default di file SharedPreferences untuk setiap setelan saat pengguna pertama kali membuka aplikasi. Ikuti langkah-langkah berikut untuk menyetel nilai default untuk tombol alih:

  1. Di MainActivity, tambahkan yang berikut ke akhir metode onCreate() yang sudah ada:

    protected void onCreate(Bundle savedInstanceState) {
       ...
       PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    }
    

    Kode di atas memastikan setelan diisialisasi dengan benar dengan nilai defaultnya. Metode setDefaultValues() membutuhkan tiga argumen:

  2. Konteks aplikasi, seperti this.
  3. ID sumber daya (preferences) untuk file sumber daya XML dengan satu atau beberapa setelan.
  4. Boolean yang menunjukkan apakah nilai default harus disetel lebih dari satu kali. Bila false, sistem akan mengatur nilai default hanya jika metode ini belum pernah dipanggil sebelumnya. Selama Anda menyetel argumen ketiga ini ke false, Anda bisa dengan aman memanggil metode ini setiap kali aktivitas utama dimulai tanpa mengganti nilai setelan pengguna yang disimpan. Akan tetapi, jika Anda mengaturnya ke true, metode akan mengganti nilai sebelumnya dengan default.

1.6 Baca nilai setelan yang diubah dari preferensi bersama

Saat aplikasi dimulai, metode onCreate() MainActivity bisa membaca nilai setelan yang telah berubah, dan menggunakan nilai yang telah berubah, bukannya nilai default.

Setiap setelan dikenali menggunakan pasangan kunci-nilai. Sistem Android menggunakan pasangan kunci-nilai ini saat menyimpan atau mengambil setelan dari file SharedPreferences untuk aplikasi Anda. Bila pengguna mengubah setelan, sistem akan memperbarui nilai yang bersangkutan dalam file SharedPreferences. Untuk menggunakan nilai setelan, aplikasi bisa menggunakan kunci untuk mendapatkan setelan dari file SharedPreferences.

Ikuti langkah-langkah berikut untuk menambahkan kode tersebut:

  1. Sebelum menambahkan kode untuk membaca nilai setelan, buat variabel string statis di SettingsActivity untuk menampung kunci untuk nilai:
    public class SettingsActivity extends AppCompatActivity {
       public static final String
                       KEY_PREF_EXAMPLE_SWITCH = "example_switch";
        ...
    }
    
  2. Di metode onCreate() di MainActivity, dan tambahkan yang berikut ini ke akhir metode:

    protected void onCreate(Bundle savedInstanceState) {
    ...
    SharedPreferences sharedPref =
                    PreferenceManager.getDefaultSharedPreferences(this);
    Boolean switchPref = sharedPref.getBoolean
                    (SettingsActivity.KEY_PREF_EXAMPLE_SWITCH, false);
    }
    

    Cuplikan kode di atas menggunakan

    • PreferenceManager.getDefaultSharedPreferences(this) untuk mendapatkan setelan sebagai objek SharedPreferences (sharedPref).
    • getBoolean() untuk mendapatkan nilai Boolean setelan yang menggunakan kunci (KEY_PREF_EXAMPLE_SWITCH yang didefinisikan di SettingsActivity) dan menetapkannya ke switchPref. Jika tidak ada nilai untuk kunci, metode getBoolean() akan menyetel nilai setelan (switchPref) ke false. Untuk nilai lain seperti string, integer, dan bilangan titik mengambang, Anda bisa menggunakan metode getString(), getInt(), atau getFloat().
  3. Tambahkan metode Toast.makeText() ke onCreate() yang menampilkan nilai setelan switchPref di sebuah toast:

    Toast.makeText(this, switchPref.toString(), Toast.LENGTH_SHORT).show();
    
  4. Jalankan aplikasi, lalu ikuti langkah-langkah ini:
    1. Ketuk Settings untuk melihat aktivitas setelan.
    2. Ketuk setelan untuk mengubah tombol alih dari on ke off, seperti yang ditampilkan di sebelah kiri gambar di bawah.
    3. Ketuk tombol Naik di aktivitas setelan untuk kembali ke aktivitas utama. Pesan toast akan muncul di aktivitas utama dengan nilai setelan, seperti yang ditampilkan di sebelah kanan gambar di bawah.
    4. Ulangi langkah-langkah ini untuk melihat perubahan pesan toast ketika Anda mengubah setelan. Mengubah Setelan dan Menampilkan Nilai Barunya

Kapan pun MainActivity dimulai atau dimulai ulang, metode onCreate() harus membaca nilai setelan untuk menggunakannya di aplikasi. Metode Toast.makeText() akan diganti dengan metode yang menginisialisasi setelan.

Anda sekarang memiliki aktivitas setelan di aplikasi yang berfungsi.

Kode solusi:

Proyek Android Studio: AppWithSettings

Tugas 2: Menggunakan template Settings Activity

Jika Anda perlu membangun beberapa sublayar setelan dan ingin memanfaatkan layar berukuran tablet, serta mempertahankan kompatibilitas dengan versi Android untuk tablet yang lebih lama, Android Studio menyediakan pintasan: template Settings Activity.

Di tugas sebelumnya, Anda telah belajar cara menggunakan aktivitas setelan kosong dan fragmen kosong untuk menambahkan setelan ke aplikasi. Tugas 2 sekarang akan menampilkan cara menggunakan template Settings Activity yang disediakan di Android Studio untuk:

  • Membagi beberapa setelan ke dalam grup.
  • Menyesuaikan setelan dan nilainya.
  • Menampilkan layar Settings utama dengan tautan header untuk setiap grup setelan, seperti General untuk setelan umum, seperti yang ditampilkan dalam gambar di bawah ini. Layar Setelan Utama dengan Header (kiri) dan Setelan Umum (kanan) di Ponsel Cerdas
  • Menampilkan layout layar detail/master dengan tautan header untuk setiap grup di sebelah kiri (master), dan grup setelan di sebelah kanan (detail), seperti yang ditampilkan dalam gambar di bawah ini. Setelan Umum di Tablet di Layar Master/Detail

Di praktik sebelumnya, Anda telah membuat aplikasi yang bernama Droid Cafe menggunakan template Basic Activity, yang menyediakan menu opsi di bilah aplikasi seperti yang ditampilkan di bawah ini. Menu Opsi di Bilah Aplikasi

Pada gambar di atas:

  1. Bilah aplikasi.
  2. Ikon tindakan menu opsi.
  3. Tombol luapan.
  4. Menu luapan opsi.

Proyek Android Studio: Untuk memulai proyek dari posisi terakhir yang Anda tinggalkan di praktik sebelumnya, unduh proyek Android Studio DroidCafe.

2.1 Menjelajahi template Settings Activity

Untuk menyertakan template Settings Activity di proyek aplikasi Anda di Android Studio, ikuti langkah-langkah ini:

  1. Salin folder proyek DroidCafe, ubah namanya menjadi DroidCafeWithSettings dan optimalkan kodenya. (Lihat Apendiks untuk petunjuk menyalin proyek.) Jalankan aplikasi untuk memastikan berjalan lancar.
  2. Pilih app di bagian atas tampilan Project: Android dan pilih New > Activity > Settings Activity.
  3. Dalam dialog yang muncul, terima Activity Name (SettingsActivity adalah nama yang disarankan) dan Title (Settings).
  4. Klik tiga titik di akhir bidang Hierarchical Parent dan pilih MainActivity sebagai aktivitas induk, sehingga tombol Naik di Settings Activity mengembalikan pengguna ke MainActivity. Memilih aktivitas induk otomatis memperbarui file AndroidManifest.xml untuk mendukung navigasi tombol Naik.
  5. Klik Finish.

Template Settings Activity tidak hanya menyediakan layout untuk layar berukuran ponsel cerdas dan tablet, tetapi jua menyediakan fungsi untuk mendengarkan perubahan setelan dan mengubah setelan untuk merefleksikan perubahan setelan. Misalnya, jika Anda mengubah setelan "Add friends to messages" (opsinya adalah Always, When possible, atau Never), opsi yang Anda pilih muncul di rangkuman di bawah setelan: Rangkuman Setelan Berubah dengan Nilai Baru

Secara umum, Anda tidak perlu mengubah kode template Settings Activity untuk menyesuaikan aktivitas untuk setelan yang Anda inginkan di aplikasi. Anda bisa menyesuaikan judul, rangkuman, nilai yang memungkinkan, nilai default setelan tanpa mengubah kode template, dan bahkan menambahkan setelan lain ke grup yang disediakan.

Anda menggunakan kode Settings Activity apa adanya. Agar berfungsi untuk aplikasi Anda, tambahkan kode ke Main Activity untuk menyetel nilai setelan default, dan untuk membaca dan menggunakan nilai setelan, seperti yang ditampilkan nanti di tugas ini.

Template Settings Activity membuat yang berikut ini untuk Anda:

  • File XML di direktori res > xml, tempat Anda bisa menambahi atau menyesuaikan setelan yang Anda inginkan.

    • pref_data_sync.xml: Layout PreferenceScreen untuk setelan "Data & sync".
    • pref_general.xml: Layout PreferenceScreen untuk setelan "General".
    • pref_headers.xml: Layout header untuk layar tampilan Setelan.
    • pref_notification.xml: Layout PreferenceScreen untuk setelan "Notifications".

    Layout XML di atas menggunakan beragam subkelas dari kelas Preference, bukan objek View, dan subkelas langsung menyediakan container untuk layout yang melibatkan beberapa setelan. Misalnya PreferenceScreen merepresentasikan Preference tingkat atas, yaitu roo hierarki Preference. File di atas menggunakan PreferenceScreendi bagian atas setiap layar setelan. Subkelas Preference untuk setelan lainnya menyediakan UI yang sesuai bagi pengguna untuk mengubah setelan. Misalnya:

    Tip: Anda bisa mengedit file XML untuk mengubah setelan default ke setelan yang Anda perlukan untuk aplikasi.

  • Sumber daya string di file file strings.xml di direktori res > values yang bisa Anda sesuaikan untuk setelan yang Anda inginkan.

    Semua yang digunakan di Settings Activity, seperti judul untuk setelan, larik string untuk daftar, dan keterangan untuk setelan, didefinisikan sebagai sumber daya string di akhir file ini. String ini ditandai oleh komentar, seperti <!-- Strings related to Settings --> and <!-- Example General settings -->.

    Tip: Anda bisa mengedit string ini untuk menyesuaikan setelan yang Anda perlukan untuk aplikasi Anda.

  • SettingsActivity di direktori java > com.example.android.projectname, yang bisa Anda gunakan apa adanya.

    Ini aktivitas yang menampilkan setelan. SettingsActivity memperluas AppCompatPreferenceActivity untuk mempertahankan kompatibilitas dengan versi Android yang lebih lama.

  • AppCompatPreferenceActivity di direktori java > com.example.android.projectname directory, yang bisa Anda gunakan apa adanya.

    Aktivitas ini adalah kelas helper yang digunakan oleh SettingsActivity untuk mempertahankan kompatibilitas mundur dengan versi Android lama.

2.2 Tambahkan item menu Settings dan hubungkan ke aktivitas

Seperti yang sudah Anda pelajari di praktik sebelumnya, Anda bisa mengedit file menu_main.xml di direktori res > menu untuk menu opsi untuk menambahkan atau membuang item menu.

  1. Editi file menu_main.xml untuk menambahkan item menu lainnya yang bernama Settings dengan id sumber daya baru action_settings:

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="50"
        android:title="Settings"
        app:showAsAction="never" />
    

    Tetapkan "never" untuk atribut app:showAsAction sehingga Settings hanya muncul di menu opsi luapan, dan tidak di bilah aplikasi itu sendiri, karena tidak akan sering digunakan.

    Tetapkan "50" untuk atribut android:orderInCategory sehingga Settings muncul di bawah Favorites (setel ke "40") tetapi di atas Contact (setel di atas "100"). Menu Opsi dengan Setelan

  2. Ekstrak sumber daya string untuk "Settings" di atribut android:title ke nama sumber daya settings.
  3. Di MainActivity, temukan blok switch-case di metode onOptionsItemSelected() yang menangani ketukan pada item di menu opsi:

    public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
          case R.id.action_order:
             displayToast(getString(R.string.action_order_message));
             return true;
          case R.id.action_status:
             displayToast(getString(R.string.action_status_message));
             return true;
          case R.id.action_favorites:
                   displayToast(getString(R.string.action_favorites_message));
             return true;
          case R.id.action_contact:
             displayToast(getString(R.string.action_contact_message));
             return true;
             }
    
       return super.onOptionsItemSelected(item);
    }
    
  4. Gunakan intent untuk meluncurkan SettingsActivity dari MainActivity. Tambahkan intent di akhir blok switch case:

          ...
          case R.id.action_settings:
             Intent intent = new Intent(this, SettingsActivity.class);
             startActivity(intent);
             return true;
             }
    
       return super.onOptionsItemSelected(item);
    }
    
  5. Jalankan aplikasi menggunakan ponsel cerdas atau emulator ponsel cerdas sehingga Anda bisa melihat bagaimana template Settings Activity menangani ukuran layar ponsel cerdas, dan ikuti langkah-langkah ini:

    1. Ketuk ikon luapan untuk menu opsi dan ketuk Settings untuk melihat aktivitas setelan, seperti yang ditampilkan di sebelah kiri gambar di bawah.

    2. Ketuk setiap header setelan (General, Notifications, dan Data & sync), seperti yang ditampilkan di bagian tengah gambar di bawah, untuk melihat grup setelan di setiap layar anak di layar anak Settings, seperti yang ditampilkan di sebelah kanan gambar di bawah.

    3. Ketuk tombol Naik di aktivitas setelan untuk kembali ke aktivitas utama. Menu Opsi dengan Setelan (kiri)

2.3 Sesuaikan setelan yang disediakan oleh template

Untuk menyesuaikan setelan yang disediakan oleh template Settings Activity, edit sumber daya string dan larik string di file strings.xml dan atribut layout untuk setiap setelan di file di direktori xml. Pada langkah ini, Anda akan mengubah setelan "Data & sync".

  1. Buka file strings.xml di direktori res > values dan konten ke komentar <!-- Example settings for Data & Sync -->:

    <!-- Example settings for Data & Sync -->
        <string name="pref_header_data_sync">Data & sync</string>
    
        <string name="pref_title_sync_frequency">Sync frequency</string>
        <string-array name="pref_sync_frequency_titles">
            <item>15 minutes</item>
            <item>30 minutes</item>
            <item>1 hour</item>
            <item>3 hours</item>
            <item>6 hours</item>
            <item>Never</item>
        </string-array>
        <string-array name="pref_sync_frequency_values">
            <item>15</item>
            <item>30</item>
            <item>60</item>
            <item>180</item>
            <item>360</item>
            <item>-1</item>
        </string-array>
              ...
    
  2. Edit sumber daya string pref_header_data_sync yang disetel ke Data & sinkron( & adalah kode HTML untuk ampersand). Ubah nilai ke Account (tanpa tanda petik).
  3. Optimalkan nama sumber daya dengan mengikuti langkah-langkah ini (aplikasi masih akan berjalan tanpa mengoptimalkan nama, tetapi pengoptimalan akan membuat kode lebih mudah dipahami):

    1. Kontrol-klik (atau klik kanan) nama sumber daya pref_header_data_sync dan pilih Refactor > Rename.
    2. Ubah nama menjadi pref_header_account, klik opsi untuk menelusuri di komentar dan string, dan klik Refactor.
  4. Edit sumber daya string pref_title_sync_frequency (yang disetel ke Sync frequency) menjadi Market.

  5. Refactor > Rename nama sumber daya menjadi pref_title_account seperti yang sudah Anda lakukan sebelumnya.
  6. Refactor > Rename sumber daya larik string pref_sync_frequency_titles menjadi pref_market_titles.
  7. Ubah setiap nilai di larik string pref_market_titles (15 minutes, 30 minutes, 1 hour, dsb.) menjadi judul pasar, seperti United States, Canada, dsb., bukan frekuensi:
    <string-array name="pref_market_titles">
            <item>United States</item>
            <item>Canada</item>
            <item>United Kingdom</item>
            <item>India</item>
            <item>Japan</item>
            <item>Other</item>
    </string-array>
    
  8. Refactor > Rename sumber daya larik string pref_sync_frequency_values menjadi pref_market_values.
  9. Ubah setiap nilai di larik string pref_market_values (15, 30, 60, dsb.) menjadi nilai pasar—yaitu singkatan, seperti US, CA, dsb.:
    <string-array name="pref_market_values">
            <item>US</item>
            <item>CA</item>
            <item>UK</item>
            <item>IN</item>
            <item>JA</item>
            <item>-1</item>
        </string-array>
    
  10. Gulir ke bawah ke sumber daya string pref_title_system_sync_settings dan edit sumber daya (yang disetel ke System sync settings) menjadi Account settings.
  11. Refactor > Rename sumber daya larik string pref_title_system_sync_settings menjadi pref_title_account_settings.
  12. Buka file pref_data_sync.xml. ListPreference di layout ini mendefinisikan setelan yang baru saja Anda ubah. Perhatikan bahwa sumber daya string untuk atribut android:entries, android:entryValues, dan android:title sekarang diubah menjadi nilai yang Anda berikan di langkah sebelumnya:
    <ListPreference
            android:defaultValue="180"
            android:entries="@array/pref_market_titles"
            android:entryValues="@array/pref_market_values"
            android:key="sync_frequency"
            android:negativeButtonText="@null"
            android:positiveButtonText="@null"
            android:title="@string/pref_title_account" />
    
  13. Ubah atribut android:defaultValue:
    android:defaultValue="US"
    

Karena kunci untuk preferensi setelan ini ("sync_frequency") di-hardcode di mana saja di kode Java, jangan ubah atribut android:key—terus gunakan "sync_frequency" sebagai kunci untuk setelan di contoh ini. Jika Anda menyesuaikan setelan secara detail di aplikasi dunia nyata, Anda akan menghabiskan waktu mengubah kunci yang di-hardcode di seluruh kode.

Catatan: Mengapa tidak menggunakan sumber daya string untuk kunci? Karena sumber daya string bisa dilokalkan ke bahasa yang berbeda menggunakan file XML multibahasa dan kunci bisa tidak sengaja diterjemahkan bersama dengan dengan string lain, yang bisa menyebabkan aplikasi crash.

2.4 Tambahkan kode untuk menyetel nilai default untuk setelan

Temukan metode onCreate() di MainActivity, dan tambahkan pernyataan PreferenceManager.setDefaultValues berikut di akhir metode:

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...
   PreferenceManager.setDefaultValues(this, R.xml.pref_general, false);
   PreferenceManager.setDefaultValues(this, R.xml.pref_notification, false);
   PreferenceManager.setDefaultValues(this, R.xml.pref_data_sync, false);
}

Nilai default sudah ditetapkan di file XML dengan dengan atribut android:defaultValue, tetapi pernyataan di atas memastikan bahwa file Preferensi Bersama diinisialisasi dengan benar dengan nilai default. Metode setDefaultValues() membutuhkan tiga argumen:

  • Konteks aplikasi, seperti this.
  • ID sumber daya untuk file XML layout setelan yang menyertakan nilai default yang disetel oleh atribut android:defaultValue.
  • Boolean yang menunjukkan apakah nilai default harus disetel lebih dari satu kali. Bila false, sistem akan mengatur nilai default hanya jika metode ini belum pernah dipanggil sebelumnya. Selama Anda menyetel argumen ketiga ini ke false, Anda bisa dengan aman memanggil metode ini setiap kali aktivitas Anda dimulai tanpa mengesampingkan nilai setelan yang disimpan pengguna dengan menyetel ulang preferensi tersebut ke nilai default. Akan tetapi, jika Anda mengaturnya ke true, metode akan mengganti nilai sebelumnya dengan default.

2.5 Tambahkan kode untuk membaca nilai untuk setelan

  1. Tambahkan kode berikut di akhir metode onCreate() MainActivity. Anda bisa langsung menambahkannya setelah kode yang Anda tambahkan di langkah sebelumnya untuk menyetel default untuk setelan:

    ...
    SharedPreferences sharedPref =
                PreferenceManager.getDefaultSharedPreferences(this);
    String marketPref = sharedPref.getString("sync_frequency", "-1");
    Toast.makeText(this, marketPref, Toast.LENGTH_SHORT).show();
    }
    

    Seperti yang telah Anda pelajari di tugas sebelumnya, Anda menggunakan PreferenceManager.getDefaultSharedPreferences(this) untuk mendapatkan setelan sebagai objek SharedPreferences (marketPref). Anda kemudian menggunakan getString() untuk mendapatkan nilai string dari setelan yang menggunakan kunci (sync_frequency) dan menetapkannya ke marketPref. Jika tidak ada nilai untuk kunci, metode getString() menyetel nilai setelan marketPref ke -1, yang merupakan nilai Other di larik pref_market_values.

  2. Jalankan aplikasi lagi menggunakan ponsel cerdas atau emulator ponsel cerdas. Saat layar utama aplikasi muncul pertama kali, Anda akan melihat pesan toast di bawah layar. Pertama kali menjalankan aplikasi, Anda akan melihat "-1" yang ditampilkan di toast karena Anda belum mengubah setelan.
  3. Ketuk Settings di menu opsi dan ketuk Account di layar Settings. Pilih Canada* di "Market" seperti yang ditampilkan di bawah ini: Mengubah
  4. Ketuk tombol Naik di bilah aplikasi untuk kembali ke layar Settings, dan ketuk lagi untuk kembali ke layar utama. Anda akan melihat pesan toast yang menampilkan "CA" (yang berarti Canada): Toast Menampilkan

    Anda telah berhasil mengintegrasikan Settings Activity dengan aplikasi Droid Cafe.

  5. Sekarang jalankan aplikasi di tablet atau emulator tablet. Karena secara fisik tablet memiliki layar yang lebih besar, waktu proses Android memanfaatkan ruang ekstra ini. Di tablet, setelan dan detailnya ditampilkan di layar yang sama, sehingga pengguna lebih mudah mengelola setelannya. Aktivitas Setelan di Tablet dalam Orientasi Horizontal

Kode solusi

Proyek Android Studio: DroidCafeWithSettings (Termasuk tantangan penyusunan kode #1).

Proyek Android Studio: DroidCafeWithSettingsChallenge (Termasuk tantangan penyusunan kode #2).

Tantangan penyusunan kode

Catatan:Semua tantangan penyusunan kode bersifat opsional dan bukan merupakan prasyarat untuk materi di bab berikutnya.

Tantangan 1: Tambahkan kode ke DroidCafeWithSettings yang membaca nilai tombol alih "Enable Social recommendations" layar anak General dari Settings, dan menampilkan nilainya beserta setelan "Market" di pesan toast yang sama layar utama.

Petunjuk: Gunakan variabel Boolean dengan shared.Pref.getBoolean dan kunci "example_switch".

Tantangan 2: Aplikasi DroidCafeWithSettings menampilkan setelan pada layar yang berukuran tablet dengan benar, tetapi tombol Up di bilah aplikasi tidak mengembalikan pengguna ke MainActivity seperti di layar berukuran ponsel cerdas. Ini karena metode onOptionsItemSelected() di setiap fragmen di SettingsActivity. Ini menggunakan yang berikut ini untuk memulai ulang SettingsActivity saat pengguna mengetuk tombol Naik:

startActivity(new Intent(getActivity(), SettingsActivity.class));

Yang di atas adalah tindakan yang sesuai di layar ponsel cerdas, tempat header Settings (General, Notifications, dan Account) muncul di layar yang terpisah. Setelah mengubah setelan, Anda menginginkan ketukan pengguna pada tombol Naik untuk mengembalikan pengguna ke header Settings.

Akan tetapi, di tablet, header selalu tampak di panel kiri (sedangkan setelan di panel kanan). Hasilnya, mengetuk tombol Naik tidak membawa pengguna ke MainActivity.

Temukan cara untuk membuat tombol Naik berfungsi dengan benar di SettingsActivity pada layar berukuran tablet.

Petunjuk: Ada beberapa cara untuk memperbaiki masalah ini. Pertimbangkan yang berikut:

  • Anda bisa menggunakan beberapa file dimens.xml di aplikasi Anda untuk mengakomodasi ukuran layar yang berbeda. Saat aplikasi berjalan di perangkat tertentu, file dimens.xml yang sesuai dipilih berdasarkan qualifier untuk file dimens.xml. Misalnya, aplikasi sudah memiliki file dimens.xml (w820dp) di direktori res > values, menggunakan qualifier (w820dp) untuk menetapkan perangkat dengan lebar layar 820dp atau lebih besar. Anda bisa menambahkan file dimens.xml lain dengan qualifier Large untuk menetapkan perangkat apa pun dengan layar lebar, seperti tablet. Aplikasi juga menyertakan file dimens.xml di direktori res > values untuk semua perangkat lain, seperti ponsel cerdas.
  • Anda bisa menambahkan sumber daya bool berikut ini antara file <resources> and </resources> tags in the dimens.xml (large) yang otomatis dipilih untuk tablet:
    <resources>
        <bool name="isTablet">true</bool>
    </resources>
    
  • Anda bisa menambahkan sumber daya bool berikut ke file dimens.xml, yang dipilih saat aplikasi berjalan pada perangkat apa pun yang tidak besar:
    <bool name="isTablet">false</bool>
    
  • Sekarang Anda bisa menambahkan blok if-else ke metode onOptionsItemSelected() di setiap fragmen di SettingsActivity yang memeriksa apakah isTablet true. Jika benar, kode Anda bisa mengalihkan tindakan tombol Naik ke MainActivity.

Rangkuman

Dalam praktik ini Anda telah belajar:

  • Menambahkan setelan tombol alih (SwitchPreference) dengan atribut di file XML preferensi, dan menyetel atributnya:.
    • android:defaultValue: Nilai default setelan.
    • android:title: Judul setelan.
    • android:key: Kunci setelan.
    • android:summary: Rangkuman setelan.
  • Menambahkan aktivitas setelan ke setelan tampilan, dan menambahkan fragmen yang memperluas PreferenceFragment untuk setiap setelan tertentu.
    • Menggunakan getFragmentManager() untuk menambahkan fragmen ke aktivitas setelan.
    • Menggunakan addPreferencesFromResource() di setiap fragmen untuk memuat file XML preferensi yang sesuai untuk fragmen tersebut.
  • Menggunakan intent untuk menghubungkan item Settings di menu opsi ke aktivitas setelan.
  • Menyetel nilai default untuk setelan menggunakan PreferenceManager.setDefaultValues().
  • Membaca nilai setelan dari SharedPreferences menggunakan PreferenceManager.getDefaultSharedPreferences(), dan memperoleh setiap nilai setelan menggunakan .getString, .getBoolean, etc.

Konsep terkait

Dokumentasi konsep terkait ada di Dasar-Dasar Developer Android: Konsep.

Ketahui selengkapnya

results matching ""

    No results matching ""