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 {

view raw
MainActivity.java
hosted with ❤ by GitHub

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();
}

view raw
MainActivity.java
hosted with ❤ by GitHub

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);
}

view raw
MainActivity.java
hosted with ❤ by GitHub

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

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

view raw
MainActivity.java
hosted with ❤ by GitHub

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 email nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

%d bloggers like this: