Как включить / отключить или показать / скрыть SharedPreferences в программах - PullRequest
0 голосов
/ 04 августа 2020

Похоже, что должно быть очень просто включить / отключить и показать / скрыть предпочтения из программы Android. Но я не могу заставить его работать, кроме как непосредственно в самом файле XML. Мне удалось найти только учебные пособия и примеры устаревших настроек. Вот пример, который я пытаюсь заставить поработать для сокрытия и отключения двух приведенных ниже настроек.

root_preferences.xml

<androidx.preference.PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="hidePref"
        app:title="Hide/Show"
        app:summary="Change this preference's visibility"/>

    <Preference
        android:key="disablePref"
        app:title="Enable/Disable"
        app:summary="Enable or Disable this preference"/>

</androidx.preference.PreferenceScreen>
MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    val sharedPreferences = Preferencemanager.getDefaultSharedPreferences(this)

    //No idea how to do the following but here are guess that obviously do not work
    sharedPreferences.edit().isVisible("hidePref", View.GONE).apply()
    sharedPreferences.edit().isEnabled("disabledPref", false).apply()
    ...
}

1 Ответ

1 голос
/ 04 августа 2020

SharedPreferences и Preference - два очень разных класса. A SharedPreferences - это одноэлементный объект, который позволяет вам взаимодействовать с файлом свойств, который содержит вашу карту данных настроек. Preference - это виджет представления, который позволяет пользователю напрямую изменять SharedPreferences.

То, что вы описываете, вы хотите сделать, так это изменить видимость или включенное состояние виджета Preference s. Это вообще не будет включать SharedPreferences.

Предположительно, у вас есть предпочтительные представления на экране в PreferenceFragmentCompat, как объясняется в документации . Чтобы изменить конкретное представление c Preference, вы используете findPreference() в своем фрагменте. Вы можете указать более конкретный тип c, чем Preference, если необходимо (при условии, что он соответствует типу фактического предпочтения в вашем XML, который вы ищете).

Тип возврата допускает значение NULL, поскольку возвращает значение NULL, если не находит его. Вы смотрите предпочтение, используя его ключ. Итак, чтобы сделать то, для чего, по-видимому, предназначен ваш опубликованный код, вы можете указать:

class MySettingsFragment: PreferenceFragmentCompat() {

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

        findPreference<Preference>("hidepref")?.isVisible = false
        findPreference<Preference>("disabledPref")?.isEnabled = false
    }

}

Я лично решил поместить все свои ключи предпочтений в файл строковых ресурсов (и использовать tools:ignore="MissingTranslation" в этом файл, чтобы линтер не жаловался). Таким образом буквальные строки ключей набираются только в одном месте, что уменьшает количество ошибок. Я пишу вспомогательные функции для получения этих значений предпочтений из SharedPreferences или поиска Preference представлений с использованием идентификатора ресурса.

...