9.2: Menambahkan Setelan ke Aplikasi
Daftar Isi:
- Yang harus sudah Anda KETAHUI
- Yang akan Anda PELAJARI
- Yang akan Anda LAKUKAN
- Ringkasan Aplikasi
- Tugas 1: Menambahkan setelan pengalihan ke aplikasi
- Tugas 2: Menggunakan template Settings Activity
- Tantangan penyusunan kode
- Rangkuman
- Konsep terkait
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.
Dalam gambar di atas:
- Settings di navigasi samping (panel samping navigasi)
- 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:
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:
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.
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.
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 denganAppCompatActivity
. 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
- 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
- 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.
- Buat direktori sumber daya baru untuk menampung file XML yang berisi setelan:
- Pilih direktori res di tampilan Project: Android, dan pilih File > New > Android Resource Directory. Dialog New Resource Directory akan muncul.
- Di menu tarik-turun tipe Resource, pilih xml. Nama Direktori otomatis berubah menjadi
xml
. - Klik OK.
- 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).
- 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.
Dalam gambar di atas:
- File preferences.xml di dalam direktori xml.
- Editor layout menampilkan konten preferences.xml.
1.2 Tambahkan preferensi XML dan atribut untuk setelan.
Seret SwitchPreference dari panel Palette di sebelah kiri ke atas layout, seperti yang ditampilkan dalam gambar di bawah ini.
Ubah nilai di panel Properties di sebelah kanan editor layout seperti berikut (lihat gambar di bawah):
- defaultValue: true
- key:example_switch
- title: Settings option
- summary: Turn this option on or off
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. UntukSwitchPreference
, 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.
Ekstrak sumber daya string untuk nilai atribut
android:title
danandroid:summary
menjadi@string/switch_title
dan@string/switch_summary
.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.Bukan file styles.xml dan tambahkan deklarasi
preferenceTheme
berikut keAppTheme
:<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> </style>
Untuk menggunakan versi
PreferenceFragmentCompat
dari PreferenceFragment, Anda juga harus mendeklarasikanpreferenceTheme
dengan gayaPreferenceThemeOverlay
ke tema aplikasi.- 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
Untuk membuat aktivitas Settings yang menyediakan UI untuk setelan, tambahkan Empty Activity ke aplikasi:
- Pilih app di bagian atas Project: Android.
- Pilih New > Activity > Empty Activity.
- Beri nama aktivitas SettingsActivity.
- Hapus centang opsi untuk menghasilkan file layout (Anda tidak memerlukannya).
- Biarkan opsi Backwards Compatibility (AppCompat) dicentang.
- 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.
- Klik Finish.
Hasilnya adalah definisi kelas berikut di SettingsActivity:
public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
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:
- Pilih app di bagian atas tampilan Project: Android lagi.
- Pilih New > Fragment > Fragment (Blank).
- Beri nama fragmen SettingsFragment.
- Hapus centang opsi untuk menghasilkan file layout (Anda tidak memerlukannya).
- Hapus centang opsi untuk menyertakan metode bawaan fragmen.
- Hapus centang opsi untuk menyertakan callback antarmuka.
- 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; } }
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;
Ganti seluruh metode
onCreateView()
di fragmen dengan metodeonCreate()
ini:@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { }
Alasan mengapa Anda mengganti
onCreateView()
denganonCreatePreferences()
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 menggunakanrootKey
.Anda bisa dengan aman membuang constructor kosong dari fragmen, karena fragmen tidak ditampilkan sendiri:
public SettingsFragment() { // Required empty public constructor }
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)
) danrootKey
untuk mengidentifikasi root preferensi diPreferenceScreen
: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); }
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 memperluasActivity
dan fragmen memperluasPreferenceFragment
.getSupportFragmentManager()
jika kelas memperluasAppCompatActivity
dan fragmen memperluasPreferenceFragmentCompat
.
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.
- Temukan blok
if
di metodeonOptionsItemSelected()
di MainActivity yang menangani ketukan pada Settings di menu opsi:if (id == R.id.action_settings) { return true; }
- Tambahkan
intent
ke blokif
untuk meluncurkan SettingsActivity:if (id == R.id.action_settings) { Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; }
- Tambahkan navigasi tombol Up ke
SettingsActivity
dengan mengedit deklarasinya di file AndroidManifest.xml untuk mendefinisikan induk aktivitas sebagaiMainActivity
.- Temukan deklarasi
SettingsActivity
di AndroidManifest.xml:<activity android:name=".SettingsActivity"></activity>
- 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>
- Temukan deklarasi
- 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.
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:
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:- Konteks aplikasi, seperti
this
. - ID sumber daya (
preferences
) untuk file sumber daya XML dengan satu atau beberapa setelan. - 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 kefalse
, Anda bisa dengan aman memanggil metode ini setiap kali aktivitas utama dimulai tanpa mengganti nilai setelan pengguna yang disimpan. Akan tetapi, jika Anda mengaturnya ketrue
, 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:
- 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"; ... }
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 keswitchPref
. Jika tidak ada nilai untuk kunci, metodegetBoolean()
akan menyetel nilai setelan (switchPref
) kefalse
. Untuk nilai lain seperti string, integer, dan bilangan titik mengambang, Anda bisa menggunakan metodegetString()
,getInt()
, ataugetFloat()
.
Tambahkan metode
Toast.makeText()
keonCreate()
yang menampilkan nilai setelanswitchPref
di sebuah toast:Toast.makeText(this, switchPref.toString(), Toast.LENGTH_SHORT).show();
- Jalankan aplikasi, lalu ikuti langkah-langkah ini:
- Ketuk Settings untuk melihat aktivitas setelan.
- Ketuk setelan untuk mengubah tombol alih dari on ke off, seperti yang ditampilkan di sebelah kiri gambar di bawah.
- 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.
- Ulangi langkah-langkah ini untuk melihat perubahan pesan toast ketika Anda mengubah setelan.
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.
- 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.
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.
Pada gambar di atas:
- Bilah aplikasi.
- Ikon tindakan menu opsi.
- Tombol luapan.
- 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:
- Salin folder proyek DroidCafe, ubah namanya menjadi DroidCafeWithSettings dan optimalkan kodenya. (Lihat Apendiks untuk petunjuk menyalin proyek.) Jalankan aplikasi untuk memastikan berjalan lancar.
- Pilih app di bagian atas tampilan Project: Android dan pilih New > Activity > Settings Activity.
- Dalam dialog yang muncul, terima Activity Name (SettingsActivity adalah nama yang disarankan) dan Title (Settings).
- 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.
- 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:
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:
- CheckBoxPreference: Kotak centang untuk setelan yang diaktifkan atau dinonaktifkan.
- ListPreference: Dialog yang berisi daftar tombol radio.
- SwitchPreference: Opsi dua keadaan yang bisa dialihkan (misalnya on/off atau true/false).
- EditTextPreference: Dialog dengan sebuah widget EditText.
- RingtonePreference: Sebuah dialog dengan nada dering di perangkat.
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
memperluasAppCompatPreferenceActivity
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.
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 atributapp:showAsAction
sehingga Settings hanya muncul di menu opsi luapan, dan tidak di bilah aplikasi itu sendiri, karena tidak akan sering digunakan.Tetapkan
"50"
untuk atributandroid:orderInCategory
sehingga Settings muncul di bawah Favorites (setel ke"40"
) tetapi di atas Contact (setel di atas"100"
).- Ekstrak sumber daya string untuk
"Settings"
di atributandroid:title
ke nama sumber dayasettings
. Di MainActivity, temukan blok
switch-case
di metodeonOptionsItemSelected()
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); }
Gunakan
intent
untuk meluncurkan SettingsActivity dari MainActivity. Tambahkanintent
di akhir blokswitch case
:... case R.id.action_settings: Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); }
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:
Ketuk ikon luapan untuk menu opsi dan ketuk Settings untuk melihat aktivitas setelan, seperti yang ditampilkan di sebelah kiri gambar di bawah.
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.
Ketuk tombol Naik di aktivitas setelan untuk kembali ke aktivitas utama.
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".
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> ...
- Edit sumber daya string
pref_header_data_sync
yang disetel keData & sinkron
(&
adalah kode HTML untuk ampersand). Ubah nilai ke Account (tanpa tanda petik). Optimalkan nama sumber daya dengan mengikuti langkah-langkah ini (aplikasi masih akan berjalan tanpa mengoptimalkan nama, tetapi pengoptimalan akan membuat kode lebih mudah dipahami):
- Kontrol-klik (atau klik kanan) nama sumber daya pref_header_data_sync dan pilih Refactor > Rename.
- Ubah nama menjadi pref_header_account, klik opsi untuk menelusuri di komentar dan string, dan klik Refactor.
Edit sumber daya string
pref_title_sync_frequency
(yang disetel keSync frequency
) menjadi Market.- Refactor > Rename nama sumber daya menjadi pref_title_account seperti yang sudah Anda lakukan sebelumnya.
- Refactor > Rename sumber daya larik string
pref_sync_frequency_titles
menjadi pref_market_titles. - 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>
- Refactor > Rename sumber daya larik string
pref_sync_frequency_values
menjadi pref_market_values. - 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>
- Gulir ke bawah ke sumber daya string
pref_title_system_sync_settings
dan edit sumber daya (yang disetel keSystem sync settings
) menjadi Account settings. - Refactor > Rename sumber daya larik string
pref_title_system_sync_settings
menjadi pref_title_account_settings. - Buka file pref_data_sync.xml.
ListPreference
di layout ini mendefinisikan setelan yang baru saja Anda ubah. Perhatikan bahwa sumber daya string untuk atributandroid:entries
,android:entryValues
, danandroid: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" />
- 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.
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 kefalse
, 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 ketrue
, metode akan mengganti nilai sebelumnya dengan default.
2.5 Tambahkan kode untuk membaca nilai untuk setelan
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 menggunakangetString()
untuk mendapatkan nilai string dari setelan yang menggunakan kunci (sync_frequency
) dan menetapkannya kemarketPref
. Jika tidak ada nilai untuk kunci, metodegetString()
menyetel nilai setelanmarketPref
ke-1
, yang merupakan nilaiOther
di larikpref_market_values
.- 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.
- Ketuk Settings di menu opsi dan ketuk Account di layar Settings. Pilih Canada* di "Market" seperti yang ditampilkan di bawah ini:
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):
Anda telah berhasil mengintegrasikan Settings Activity dengan aplikasi Droid Cafe.
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.
Kode solusi
Proyek Android Studio: DroidCafeWithSettings (Termasuk tantangan penyusunan kode #1).
Proyek Android Studio: DroidCafeWithSettingsChallenge (Termasuk tantangan penyusunan kode #2).
Tantangan penyusunan kode
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, filedimens.xml
yang sesuai dipilih berdasarkan qualifier untuk filedimens.xml
. Misalnya, aplikasi sudah memiliki filedimens.xml (w820dp)
di direktori res > values, menggunakan qualifier(w820dp)
untuk menetapkan perangkat dengan lebar layar 820dp atau lebih besar. Anda bisa menambahkan filedimens.xml
lain dengan qualifierLarge
untuk menetapkan perangkat apa pun dengan layar lebar, seperti tablet. Aplikasi juga menyertakan filedimens.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 thedimens.xml (large)
yang otomatis dipilih untuk tablet:<resources> <bool name="isTablet">true</bool> </resources>
- Anda bisa menambahkan sumber daya
bool
berikut ke filedimens.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 apakahisTablet
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
- 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
- Dokumentasi Android Studio:
- Panduan Android API, bagian "Kembangkan":
- Spesifikasi Desain Material:
- Setelan (desain)
- Lainnya:
- Stack Overflow: How does one get dimens.xml into Android Studio?
- Stack Overflow: Determine if the device is a smartphone or tablet?