Общие настройки не сохраняются и не восстанавливаются после настройки в Настройках. - PullRequest
0 голосов
/ 05 октября 2018

Я выполнил базовое задание по настройке.Что я хочу, так это когда пользователь выбирает опцию из списка (в настройках), это сохраняет значение и «флаг».

С этим флагом я хочу использовать его в основной активности, чтобыПринудительный вызов API.

Проблема в том, что значения в общих настройках не "работают" должным образом ...

Вот как я настраиваю активность настроек:

public class SettingsActivity extends AppCompatPreferenceActivity {


        private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object value) {
                String stringValue = value.toString();

                if (preference instanceof ListPreference) {
                    // For list preferences, look up the correct display value in
                    // the preference's 'entries' list.
                    ListPreference listPreference = (ListPreference) preference;
                    int index = listPreference.findIndexOfValue(stringValue);

                    // Set the summary to reflect the new value.
                    preference.setSummary(
                            index >= 0
                                    ? listPreference.getEntries()[index]
                                    : null);

                    PreferenceManager
                            .getDefaultSharedPreferences(preference.getContext())
                            .edit()
                            .putBoolean("reload_data", true).commit();

                } else {
                    // For all other preferences, set the summary to the value's
                    // simple string representation.
                    preference.setSummary(stringValue);
                }
                return true;
            }
        };


        private static boolean isXLargeTablet(Context context) {
            return (context.getResources().getConfiguration().screenLayout
                    & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
        }


        private static void bindPreferenceSummaryToValue(Preference preference) {
            // Set the listener to watch for value changes.
            preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

            // Trigger the listener immediately with the preference's
            // current value.
            sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                    PreferenceManager
                            .getDefaultSharedPreferences(preference.getContext())
                            .getString(preference.getKey(), ""));
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setupActionBar();
            addPreferencesFromResource(R.xml.pref_general);
        }

        /**
         * Set up the {@link android.app.ActionBar}, if the API is available.
         */
        private void setupActionBar() {
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                // Show the Up button in the action bar.
                actionBar.setDisplayHomeAsUpEnabled(true);
            }
        }

        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                if (!super.onMenuItemSelected(featureId, item)) {
                    NavUtils.navigateUpFromSameTask(this);
                }
                return true;
            }
            return super.onMenuItemSelected(featureId, item);
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public boolean onIsMultiPane() {
            return isXLargeTablet(this);
        }

        /**
         * This method stops fragment injection in malicious applications.
         * Make sure to deny any unknown fragments here.
         */
        protected boolean isValidFragment(String fragmentName) {
            return SettingsFragment.class.getName().equals(fragmentName);
        }

        public static class SettingsFragment extends PreferenceFragment {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.pref_general);
                setHasOptionsMenu(true);
                bindPreferenceSummaryToValue(findPreference(getString(R.string.languages_preferences_title)));
            }

            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                int id = item.getItemId();
                if (id == android.R.id.home) {
                    startActivity(new Intent(getActivity(), SettingsActivity.class));
                    return true;
                }
                return super.onOptionsItemSelected(item);
            }

        }
    }
}

Обратите внимание, что я поставил общее предпочтение, чтобы сохранить флаг как:

PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.edit()
.putBoolean("reload_data", true).commit();

А вот как я читаю в MainActivity

 @Override
    protected void onResume() {
        boolean reloadData = PreferenceManager
                .getDefaultSharedPreferences(getBaseContext())
                .getBoolean("reload_data", true);

        if (reloadData && presenter != null) {
            if (this.dailiesMap != null) {
                this.dailiesMap.clear();
            }
            presenter.getDailiesAchievementModels();
            PreferenceManager
                    .getDefaultSharedPreferences(getBaseContext())
                    .edit()
                    .putBoolean("reload_data", false).apply();
        }
        super.onResume();
    }

Когда пользователь приходит изНастройки должны быть истинными, если пользователь выбирает какую-либо опцию из списка.Но это не работает.значение ложное.

Первое изображение перед сменой языка (опция предпочтения) Второе изображение после смены языка

enter image description here enter image description here

Как видите, смена языка, но не "мой пользовательский" ключ

...