Shared Preferences jeszcze raz – CoNaObiad – #2B

Przy przerabianiu kursu androida z Google Udacity Scholarship uznałam, że warto od razu wprowadzać to czego się nauczyłam do apki. W związku z tym postanowiłam przerobić sposób w jaki obsługuję ustawienia użytkownika, tak żeby było bardziej pro 😉

Przede wszystkim wprowadziłam więcej listenerów (jakiekolwiek 😉 ) i to sprawiło, że przestałam się troszczyć o sprawdzenie, czy coś się zmienia czy nie. Od tego mam odpowiednie metody.


public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

Pozostawiłam na razie statyczne zmienne przechowujące wartości ustawień. Jakby się coś zmieniło wtedy od nowa przeładowujemy aplikację.


@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("plan_length")) {
planLength = Integer.parseInt(sharedPreferences.getString(key, getString(R.string.plan_length_default_value)));
} else if (key.equals("first_day")) {
firstDayOfWeek = Integer.parseInt(sharedPreferences.getString(key, getString(R.string.first_day_default_value)));
}
recreate();
}

W metodzie onCreate wywołuję metodę pobierającą aktualne wartości ustawień i rejestruję listener:


private void setupSharedPreferences() {
SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
planLength = Integer.parseInt(defaultSharedPreferences.getString("plan_length", getString(R.string.plan_length_default_value)));
firstDayOfWeek = Integer.parseInt(defaultSharedPreferences.getString("first_day", getString(R.string.first_day_default_value)));
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this);
}

Jeszcze pamiętam o tym, żeby zarejstrowany listener odpiąć w odpowiednim momencie 😉


@Override
protected void onDestroy() {
super.onDestroy();
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
}

Wyjęłam też fragment z SettingsActivity i jemu też dostały się listenery, tak aż dwa 😉


public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, Preference.OnPreferenceChangeListener {

Pierwszy czuwa nad tym, żeby przy zmianie wartości odświeżyć też podpis pod ustawieniem żeby nie trzeba było w nie klikać.


@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = findPreference(key);
if (!(preference instanceof CheckBoxPreference)) {
String value = sharedPreferences.getString(preference.getKey(), "");
setPreferenceSummary(preference, value);
}
}

Drugiego listenera użyłam do stworzenia walidacji na długość planu, żeby użytkownicy mogli wstawić tylko wartości z przedziału 1-30.


@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast error = Toast.makeText(getContext(), R.string.plan_length_error_message, Toast.LENGTH_SHORT);
String planKey = getString(R.string.plan_length_key);
if (preference.getKey().equals(planKey)) {
String stringSize = ((String) (newValue)).trim();
if (stringSize.equals("")) stringSize = getString(R.string.plan_length_default_value);
try {
int size = Integer.parseInt(stringSize);
if (size < 1 || size > 30) {
error.show();
return false;
}
} catch (NumberFormatException nfe) {
error.show();
return false;
}
}
return true;
}

Wygląda tak, jak poprzednio, a nawet lepiej, więc nie zepsułam 😉

Screenshot_2017-12-10-17-03-16_com.projects.jezinka.conaobiad.png

W planach mam jeszcze przerobienie list na RecyclerView, ale jeszcze trzeba będzie przerobić bazę danych 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.