Tạo màn hình setting trong android



  • Xin chào tất cả mọi người. Hôm nay, mình sẽ iết 1 bài chia sẻ về cách làm thế nào để tạo ra màn hình setting một cách nhanh chóng nhất trong android.
    Chúng ta sẽ làm một màn hình như sau:

    1. Tạo project android

    Bạn có thể truy cập vào Android studio sau đó tạo 1 project mới , mình sẽ sử dụng kotlin để làm ứng dụng này , sẽ như hình bên dưới:

    2. Tạo 1 PreferenceFragment

    Mình sẽ tạo 1 Activity và nhúng fragment vào trong đó, code sẽ như sau:
    import android.os.Bundle
    import android.preference.PreferenceFragment
    import android.support.v7.app.AppCompatActivity

    class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        if (fragmentManager.findFragmentById(android.R.id.content) == null) {
            fragmentManager.beginTransaction()
                    .add(android.R.id.content, SettingsFragment()).commit()
        }
    }
    
    
    class SettingsFragment : PreferenceFragment() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            addPreferencesFromResource(R.xml.preferences)
        }
    }
    

    }

    3. Tạo 1 Our Preferences

    Bạn tạo 1 XML file với tên là : preferences.xml và lưu vào folder res/xml , code sẽ như sau:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <CheckBoxPreference
                android:key="checkbox"
                android:summary="Tap to check if on or off"
                android:title="Checkbox Preference" />
        <RingtonePreference
                android:key="ringtone"
                android:showDefault="true"
                android:showSilent="true"
                android:summary="Pick a ringtone you like"
                android:title="Ringtone Preference" />
        <EditTextPreference
                android:dialogTitle="Enter a text"
                android:key="text"
                android:summary="Click to show a text entry dialog"
                android:title="EditText Preference" />
        <ListPreference
                android:dialogTitle="Select duration"
                android:entries="@array/settings_list_preference_titles"
                android:entryValues="@array/settings_list_preference_values"
                android:key="list"
                android:summary="Click to show a list to choose from"
                android:title="List Preference" />
        <SwitchPreference
                android:key="switch"
                android:title="Switch Preference"
                android:summary="Click to switch on or off"
                android:defaultValue="true"/>
    </PreferenceScreen>
    

    Node root của our prefrerences.xml là PreferenceScreen

    Con của PreferenceScreen sẽ là các Preference gồm một số thuộc tính sau đây:

    1. android:key : là thuộc tính sử dụng để get value trong đối tượng SharedPreferences
    2. android:title : là thuộc tính sử dụng để set tiêu đề
    3. android:summary : là thuộc tính để set summary của Preference, nhưng nó không bắt buộc
    4. android:defaultValue : là thuộc tính để set giá trị mặc định cho đối tượng Preference

    4: Binding giá trị Preference Summary

    class SettingsActivity : AppCompatActivity() {
     
        
        class SettingsFragment : PreferenceFragment() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                addPreferencesFromResource(R.xml.preferences)
     
                bindPreferenceSummaryToValue(findPreference("ringtone"))
                bindPreferenceSummaryToValue(findPreference("text"))
                bindPreferenceSummaryToValue(findPreference("list"))
            }
        }
    }
    

    Trong class , chúng ta sẽ tạo 1 helper phương thức bindPreferenceSummaryToValue để update giá trị của setting khi user selected giá trị , code sẽ như sau:

    class SettingsActivity : AppCompatActivity() {
        // ...
        companion object {
             
            /**
             * A preference value change listener that updates the preference's summary
             * to reflect its new value.
             */
            private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value ->
     
                val stringValue = value.toString()
     
                if (preference is ListPreference) {
                    // For list preferences, look up the correct display value in
                    // the preference's 'entries' list.
                    val listPreference = preference
                    val index = listPreference.findIndexOfValue(stringValue)
     
                    // Set the summary to reflect the new value.
                    preference.setSummary(
                            if (index >= 0)
                                listPreference.entries[index]
                            else
                                null)
     
                } else if (preference is RingtonePreference) {
                    // For ringtone preferences, look up the correct display value
                    // using RingtoneManager.
                    if (TextUtils.isEmpty(stringValue)) {
                        // Empty values correspond to 'silent' (no ringtone).
                        preference.setSummary("Silent")
     
                    } else {
                        val ringtone = RingtoneManager.getRingtone(
                                preference.getContext(), Uri.parse(stringValue))
     
                        if (ringtone == null) {
                            // Clear the summary if there was a lookup error.
                            preference.setSummary(null)
                        } else {
                            // Set the summary to reflect the new ringtone display
                            // name.
                            val name = ringtone.getTitle(preference.getContext())
                            preference.setSummary(name)
                        }
                    }
                }
                else {
                    // For all other preferences, set the summary to the value's
                    // simple string representation.
                    preference.summary = stringValue
                }
                true
            }
     
            private fun bindPreferenceSummaryToValue(preference: Preference) {
                // Set the listener to watch for value changes.
                preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener
     
                // Trigger the listener immediately with the preference's
                // current value.
                sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                        PreferenceManager
                                .getDefaultSharedPreferences(preference.context)
                                .getString(preference.key, ""))
            }
        }
    }
    

    Khi run project lên sẽ được kết quả như bên trên.
    Bài viết được dịch từ : https://code.tutsplus.com/tutorials/how-to-code-a-settings-screen-in-an-android-app--cms-30433 các bạn có thể tham khảo chi tiết tại đây.
    Nguồn: Viblo


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới LaptrinhX, vui lòng đợi một lúc để chúng tôi thử kết nối lại.