Tạo màn hình settings với SharedPreferences
Các ứng dụng android thường bao gồm màn hình setting cho phép người dùng thay đổi các tính năng cũng như hành vi của ứng dụng. Ví dụ, tắt-bật thông báo hay bao lâu thì ứng dụng sẽ đồng bộ dữ liệu từ trên cloud. Nếu muốn tạo màn hình setting cho ứng dụng của mình, ta nên dùng Android's preference ...
Các ứng dụng android thường bao gồm màn hình setting cho phép người dùng thay đổi các tính năng cũng như hành vi của ứng dụng. Ví dụ, tắt-bật thông báo hay bao lâu thì ứng dụng sẽ đồng bộ dữ liệu từ trên cloud. Nếu muốn tạo màn hình setting cho ứng dụng của mình, ta nên dùng Android's preference API để xây dựng giao diện cho màn hình setting. API cung cấp cho ta một số widget để xây dựng giao diện cho màn hình settings như: EdittextPreference, CheckBoxPreference, ListPreference
Tổng quan
Thay vì sử dụng View object để xây dựng giao diện cho màn hình setting thì ta sẽ dùng subclass của class Preference trong file XML
Mỗi Preference object sẽ tương ứng với một setting, và chúng sử dụng SharedPreferences file để lưu setting cho ứng dụng. Mỗi khi người dùng thay đổi setting thì hệ thống sẽ update lại giá trị tương ứng trong file SharedPreferences.
Bởi vì ta sử dụng Preference object thay vì View object để tạo giao diện cho màn hình setting, do đó ta sẽ sử dụng Activity hoặc Fragment đặc biệt để hiển thị màn hình setting:
- Nếu ứng dụng của bạn support android version nhỏ hơn 3.0 thì ta nên dùng PreferenceActivity.
- Nếu ứng dụng của bạn support android version 3.0 trở lên thì ta nên dùng activity chứa fragment PreferenceFragment để hiển thị màn hình setting.
Preferences phổ biến
Một số Preference phổ biến dùng trong màn hình setting:
- CheckBoxPreference: Hiển thị checkbox cho phép người dùng cài đặt setting là enable hay disable. Giá trị sử dụng là boolean
- ListPreference: Sẽ mở một dialog với một danh sách các radio buttons.
- EditTextPreference: Mở một dialog với EditText. Giá trị được lưu dưới dạng String
Khai báo Preference trong XML file
Ta có thể tạo Preference khi runtime, tuy nhiên ta nên khai báo chúng trong file xml , như thế sẽ dễ đọc cũng như update lại, hơn nữa những thông tin setting là có trước rồi. Ta sẽ lưu file xml trong folder res/xml. Ví dụ:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="pref_sync" android:title="@string/pref_sync" android:summary="@string/pref_sync_summ" android:defaultValue="true" /> <ListPreference android:dependency="pref_sync" android:key="pref_syncConnectionType" android:title="@string/pref_syncConnectionType" android:dialogTitle="@string/pref_syncConnectionType" android:entries="@array/pref_syncConnectionTypes_entries" android:entryValues="@array/pref_syncConnectionTypes_values" android:defaultValue="@string/pref_syncConnectionTypes_default" /> </PreferenceScreen>
Trong ví dụ trên, mỗi item CheckBoxPreference, ListPreference đề chứa các thuộc tính sau:
- android:key: giá trị này sẽ được sử dụng làm key trong key-value của SharedPreference khi lưu dữ liệu setting. Thuộc tính này bắt buộc phải có trong các Preference object để lưu dữ liệu.
- android:title: hiển thị tên của setting cho người dùng, ví dụ: Notification.
- android:defaultValue: Hiển thị giá trị mặc định của setting. Ta nên chỉ ra giá trị mặc định cho tất cả các settings. Để biết thêm nhiều thông tin hơn nữa về các thuộc tính của Preference object bạn nên tham khảo tại đây
Tạo group settings
Nếu có quá nhiều setting sẽ gây khó khăn cho người sử dụng trong việc tìm kiếm để thay đổi, để dễ dàng hơn, ta sẽ chia các thông tin setting thành các group. Khi đó ta có 2 cách để biểu diễn các setting group:
- Sử dụng title
- Sử dụng màn hình phụ
Sử dụng title
để chia các setting thành từng group ta sử dụng tag PreferenceCategory, sau đó ta sẽ cho mỗi object Preference vào trong PreferenceCategory Ví dụ:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/pref_sms_storage_title" android:key="pref_key_storage_settings"> <CheckBoxPreference android:key="pref_key_auto_delete" android:summary="@string/pref_summary_auto_delete" android:title="@string/pref_title_auto_delete" android:defaultValue="false"... /> <Preference android:key="pref_key_sms_delete_limit" android:dependency="pref_key_auto_delete" android:summary="@string/pref_summary_delete_limit" android:title="@string/pref_title_sms_delete"... /> <Preference android:key="pref_key_mms_delete_limit" android:dependency="pref_key_auto_delete" android:summary="@string/pref_summary_delete_limit" android:title="@string/pref_title_mms_delete" ... /> </PreferenceCategory> ... </PreferenceScreen>
Sử dụng màn hình phụ
để sử dụng một màn hình phụ ta sẽ để các Preference object bên trong một PreferenceScreen khác. Ví dụ:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen android:key="button_voicemail_category_key" android:title="@string/voicemail" android:persistent="false"> <ListPreference android:key="button_voicemail_provider_key" android:title="@string/voicemail_provider" ... /> <PreferenceScreen android:key="button_voicemail_setting_key" android:title="@string/voicemail_settings" android:persistent="false"> ... </PreferenceScreen> <RingtonePreference android:key="button_voicemail_ringtone_key" android:title="@string/voicemail_ringtone_title" android:ringtoneType="notification" ... /> ... </PreferenceScreen> ... </PreferenceScreen>
Ta sẽ được kết quả như sau:
Tạo Preference Activity
Để hiển thị màn hình setting, ta cần tạo một activity extend class PreferenceActivity. Ví dụ:
public class SettingsActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }
Phương thức addPreferencesFromResource() được dùng để load file xml định nghĩa cho màn hình setting. Tham khảo
Dùng Preference Fragment
Nếu ta tạo ứng dụng hỗ trợ Android phiên bản 3.0 trở lên thì ta nên sử dụng PreferenceFragment để hiển thị màn hình setting. Ví dụ:
public static class SettingsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); } ... }
Sau đó ta sẽ add fragment trên vào một activity bất kì để hiển thị màn hình setting
public class SettingsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Display the fragment as the main content. getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } }
nguồn: https://developer.android.com/guide/topics/ui/settings.html