在“设置”活动中设置后,共享首选项未保存或恢复

时间:2018-10-04 22:33:14

标签: android kotlin sharedpreferences settings

我已经完成了基本的设置活动。我想要的是,当用户从列表中(在“设置”中)选择一个选项时,这将保存该值和一个“标志”。

使用此标志,我想在Main Activity中使用它来强制进行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

如您所见,语言会更改,但“我的自定义”键不会更改

0 个答案:

没有答案