Как отобразить список RadioButton в PreferenceScreen (не в диалоге) - PullRequest
0 голосов
/ 25 сентября 2019

Как можно отобразить список переключателей внутри PreferenceSecreen, а не в диалоге?Действительно раздражает необходимость нажимать несколько раз, чтобы выбрать элемент из этого списка.

Ожидаемый результат

enter image description here

Текущий результат

enter image description here

enter image description here

app_preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <ListPreference
            android:key="prefPhotoFilter"
            android:title="Photo filter"
            android:entries="@array/photoFilters" />

</PreferenceScreen>

strings.xml

<string-array name="photoFilters">
    <item name="1">Natural</item>
    <item name="2">Boosted</item>
    <item name="3">Saturated</item>
</string-array>

enter image description here

1 Ответ

0 голосов
/ 25 сентября 2019

В соответствии с этим Суть , вы можете расширить CheckBoxPreference и создать макет с переключателем.

Примерно так: во-первых, создайте новый макет, содержащийтолько радиокнопка, назовем ее

preference_widget_radiobutton.xml

<?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:clickable="false"
        android:focusable="false" />

, затем создадим подкласс CheckBoxPreference:

class RadioButtonPreference : CheckBoxPreference {

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) { setView() }

    constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs) { setView() }


    private fun setView(){
        widgetLayoutResource = R.layout.preference_widget_radiobutton
    }

    override fun onClick() {
        if (this.isChecked) 
            return

        super.onClick()
    }
}

на экране app_preferences.xml:

    <PreferenceCategory android:title="Photo Filters">
        <Your_class_package_dirctory.RadioButtonPreference
                android:key="naturals"
                android:title="Natural" />
        <Your_class_package_dirctory.RadioButtonPreference
                android:key="boosted"
                android:title="Boosted" />
        <Your_class_package_dirctory.RadioButtonPreference
                android:key="saturated"
                android:title="Saturated" />
    </PreferenceCategory>

Теперь, как вы можете видеть, это будет вести себя как обычный CheckBox, не будет снимать галочку с предыдущего переключателя, чтобы решить эту проблему:

В коде вашего предпочтения на экране:


class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClickListener{
    private val sharedPreference = AppPreferences()


    private var oldCheckedPreference: RadioButtonPreference? = null

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.app_preferences, rootKey)

        findPreference<RadioButtonPreference>("naturals")?.apply {
            /*
            You can set the defualt button to be checked by:
              updateCheckedRadioButton(this)
            */
            onPreferenceClickListener = this@SettingsFragment
        }
        findPreference<RadioButtonPreference>("boosted")?.onPreferenceClickListener = this
        findPreference<RadioButtonPreference>("saturated")?.onPreferenceClickListener = this

    }

    private fun updateCheckedRadioButton(radioButtonPreference: RadioButtonPreference) {

        //Uncheck the previous selected button if there is.
        oldCheckedPreference?.isChecked = false
        radioButtonPreference.isChecked = true
        oldCheckedPreference = radioButtonPreference

    }

    override fun onPreferenceClick(preference: Preference): Boolean {
        if (preference is RadioButtonPreference)
            updateCheckedRadioButton(preference)

        return true
    }

}

и результат:

result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...