12/08/2018, 15:53

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

0