Wygląda na to, że powinno być bardzo proste, aby włączyć / wyłączyć i pokazać / ukrywać preferencje w programie Android. Ale nie mogę tego naprawić inny niż bezpośrednio w samym pliku XML. Udało mi się znaleźć samouczki i przykład dla przestarzałych preferencji. Oto przykład, który próbuję dostać się do pracy za ukrywanie i wyłączenie dwóch preferencji poniżej.

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()
    ...
}
0
Tom 4 sierpień 2020, 04:22

1 odpowiedź

Najlepsza odpowiedź

SharedPreferences i Preference są dwiema bardzo wyraźnymi klasami. A SharedPreferences jest obiektem Singleton, który umożliwia interakcję z plikiem Właściwości, który posiada mapę danych preferencyjnych. A Preference jest widżetem widoku, który umożliwia użytkownikowi bezpośrednio modyfikować SharedPreferences.

Co chcesz zrobić, to zmodyfikować widoczność lub włączony stan widżetu widoku Preference s. W ogóle nie zaangażuje SharedPreferences.

Przypuszczalnie masz widoki preferencji na ekranie w {x0}} jako jako Dokumentacja wyjaśnia. Aby zmodyfikować określony Preference, używasz findPreference() w fragmencie. W razie potrzeby można określić bardziej określony typ niż Preference.

Typ powrotu jest nieważny, ponieważ zwraca null, jeśli go nie znajdzie. Patrzysz preferencje za pomocą jego klucza. Aby zrobić to, co wydaje się, aby twój wysłany kod ma być przeznaczony, możesz umieścić:

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
    }

}

Osobiście zdecydujesz się umieścić wszystkie moje klucze preferencyjne w pliku zasobów łańcuchowych (i użyj tools:ignore="MissingTranslation" w tym pliku, aby utrzymać linder narzekanie). W ten sposób literalne ciągi kluczy są wpisane tylko w jednym miejscu, zmniejszając błąd. Piszę funkcje pomocnicze do uzyskania tych wartości preferencji z SharedPreferences lub znalezienie wyświetleń Preference za pomocą identyfikatora zasobów.

1
Tenfour04 4 sierpień 2020, 02:56