【问题标题】:Loading previously stored data from SharedPreferences into PreferenceFragment将以前存储的数据从 SharedPreferences 加载到 PreferenceFragment
【发布时间】:2016-01-03 19:09:59
【问题描述】:

我已按照文档创建偏好片段。我的所有首选项都按预期工作,但我有一个名字和姓氏设置,我想从 SharedPreferences 动态加载。当用户登录时,这些值已经被存储。

它们在strings.xml中的值:

 <string name="first_name">first_name</string>
 <string name="last_name">last_name</string>

登录时保存:

editor.putString(mContext.getResources().getString(R.string.first_name), firstName);
editor.putString(mContext.getResources().getString(R.string.last_name), lastName);
editor.commit();

preferences.xml 中的首选项:

   <EditTextPreference
                android:key="@string/first_name"
                android:inputType="text"
                android:persistent="true"
                android:title="First Name"/>
    <EditTextPreference
                android:key="@string/last_name"
                android:inputType="text"
                android:persistent="true"
                android:title="Last Name"/>

尝试将它们加载到偏好片段中:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sessionManager = SessionManager.getInstance(getActivity());
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);

        // Set first and last name preference default values
        firstNamePreference = (EditTextPreference)findPreference("first_name");
        lastNamePreference = (EditTextPreference)findPreference("last_name");
        nearbyPreference = (CheckBoxPreference)findPreference("show_places");
//        firstNamePreference.setText(sessionManager.getUserFirstName());
//        firstNamePreference.setSummary(sessionManager.getUserFirstName());
//        lastNamePreference.setText(sessionManager.getUserLastName());
//        lastNamePreference.setSummary(sessionManager.getUserLastName());
        nearbyPreference.setDefaultValue(true);
    }

所以我可以手动设置它们(以及摘要),但我真的很想从 SharedPreferences 中已经设置的值中设置它们。我该怎么做?

【问题讨论】:

    标签: android fragment settings preferences


    【解决方案1】:

    因此,在查看了我的代码后,我意识到我的应用程序将首选项存储在默认文件之外的文件中。所以,我必须从this 文章中执行以下操作:

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
    
    
            sharedPreferences = getActivity().getSharedPreferences("file_name", 0); // 0 is private
    
            // show the current value in the settings screen
            for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
                pickPreferenceObject(getPreferenceScreen().getPreference(i));
            }
        }
    
    private void pickPreferenceObject(Preference p) {
            if (p instanceof PreferenceCategory) {
                PreferenceCategory cat = (PreferenceCategory) p;
                for (int i = 0; i < cat.getPreferenceCount(); i++) {
                    pickPreferenceObject(cat.getPreference(i));
                }
            } else {
                initSummary(p);
            }
        }
    
    private void initSummary(Preference p) {
            if (p instanceof EditTextPreference) {
                EditTextPreference editTextPref = (EditTextPreference) p;
                String value = sharedPreferences.getString(editTextPref.getKey(), "");
                p.setSummary(value);
                ((EditTextPreference) p).setText(value);
            }
            // More logic for ListPreference, etc...
        }
    

    否则,您可能只使用默认首选项设置它们,如下访问:

    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    

    【讨论】:

    • 这整件事真是个笑话。 Android又来了,太棒了
    【解决方案2】:

    您应该考虑这样做:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    
        // Sets the first name based on the SharedPreference value
        Preference pref = getPreferenceScreen().findPreference("first_name");
        pref.setSummary(pref.getSharedPreferences().getString("first_name", "default value if first_name key not set"));
    
    }
    

    【讨论】:

    • 不幸的是,这对我不起作用:(@michaelcarrano
    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-11-11
    相关资源
    最近更新 更多