Ustawienia   Należy do Android Jetpack.

Ustawienia umożliwiają użytkownikom zmianę sposobu działania i sposobu działania aplikacji. Mogą one wpływać na działanie aplikacji w tle, np. częstotliwość synchronizowania danych przez aplikację z chmurą lub mieć szerszy zasięg, np. zmianę zawartości i sposobu prezentacji interfejsu użytkownika.

Aby zintegrować z aplikacją ustawienia, które można skonfigurować przez użytkownika, użyj biblioteki preferencji AndroidaX. Ta biblioteka zarządza interfejsem użytkownika i działa z miejscem na dane, dzięki czemu możesz definiować tylko indywidualne ustawienia, które może konfigurować użytkownik. Biblioteka zawiera motyw Material Design, który zapewnia spójne wrażenia użytkownika na różnych urządzeniach i w różnych wersjach systemu operacyjnego.

Rozpocznij

Preference to podstawowy element biblioteki preferencji. Ekran ustawień zawiera hierarchię Preference. Hierarchię możesz zdefiniować jako zasób XML lub utworzyć ją w kodzie.

W następnych sekcjach opisaliśmy, jak utworzyć prosty ekran ustawień za pomocą biblioteki AndroidX Preference.

Zanim zaczniesz, dodaj do pliku build.gradle zależność biblioteki preferencji:

GroovyKotlin
dependencies {
    implementation
"androidx.preference:preference-ktx:1.2.0"
}
dependencies {
    implementation
("androidx.preference:preference-ktx:1.2.0")
}

Po zsynchronizowaniu Gradle możesz przejść do części XML zadania.

Tworzenie hierarchii

W projekcie przejdź do folderu res/xml, utwórz plik preferences.xml i dodaj do niego ten kod:

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

   
<SwitchPreferenceCompat
       
app:key="notifications"
       
app:title="Enable message notifications"/>

   
<Preference
       
app:key="feedback"
       
app:title="Send feedback"
       
app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

Ta hierarchia zawiera 2 obiekty Preference: SwitchPreferenceCompat, który pozwala użytkownikom włączać i wyłączać ustawienie, oraz podstawowy obiekt Preference bez widgeta.

Podczas tworzenia hierarchii każdy element Preference musi mieć unikalny klucz.

Rozwijanie hierarchii

Aby zawyżyć hierarchię na podstawie atrybutu XML, utwórz PreferenceFragmentCompat, zastąp onCreatePreferences() i podaj zasób XML do powiększenia, jak pokazano w tym przykładzie:

KotlinJava
class MySettingsFragment : PreferenceFragmentCompat() {
   
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource
(R.xml.preferences, rootKey)
   
}
}
public class MySettingsFragment extends PreferenceFragmentCompat {
   
@Override
   
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource
(R.xml.preferences, rootKey);
   
}
}

Następnie możesz dodać tę Fragment do Activity tak samo jak każdą inną Fragment:

KotlinJava
class MySettingsActivity : AppCompatActivity() {
   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        supportFragmentManager
               
.beginTransaction()
               
.replace(R.id.settings_container, MySettingsFragment())
               
.commit()
   
}
}
public class MySettingsActivity extends AppCompatActivity {
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        getSupportFragmentManager
()
               
.beginTransaction()
               
.replace(R.id.settings_container, new MySettingsFragment())
               
.commit();
   
}
}

Wynik przedstawia poniższy obraz:

Obraz pokazujący przykład ekranu ustawień
Rysunek 1. Ekran ustawień utworzony za pomocą 2 obiektów Preference.

Monitorowanie ustawień

Aby uzyskać zdarzenie, gdy zmieni się Twoje preferencje, zarejestruj dla niego detektor:

KotlinJava
findPreference<SwitchPreferenceCompat>("notifications")
   
?.setOnPreferenceChangeListener { _, newValue ->
       
Log.d("Preferences", "Notifications enabled: $newValue")
       
true // Return true if the event is handled.
   
}

findPreference
<Preference>("feedback")
   
?.setOnPreferenceClickListener {
       
Log.d("Preferences", "Feedback was clicked")
       
true // Return true if the click is handled.
   
}
SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref
.setOnPreferenceChangeListener((preference, newValue) -> {
       
Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
       
return true; // Return true if the event is handled.
   
});
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref
.setOnPreferenceClickListener((preference) -> {
       
Log.d("Preferences", "Feedback was clicked");
       
return true; // Return true if the event is handled.
   
});
}

Odczyt bieżącej wartości preferencji

Funkcja PreferenceFragmentCompat ukrywa znaczną część maszyn używanych do zapisywania i odczytywania ustawień. Jednak wszystko jest przechowywane za pomocą funkcji SharedPreferences, a wartości te możesz odczytać w zwykły sposób za pomocą funkcji SharedPreferences:

KotlinJava
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences
.forEach {
   
Log.d("Preferences", "${it.key} -> ${it.value}")
}
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences
.forEach((key, value) ->{
   
Log.d("Preferences", String.format("%s -> %s", key, value));
});

Poprzedni fragment kodu pobiera wystąpienie domyślnego obiektu SharedPreferences w aplikacji, uzyskuje dostęp do wszystkich zapisanych wartości, przechodzi przez nie w pętli i wypisuje je w Logcat.