如何在PreferenceFragment中加载首选项默认值?

时间:2017-04-15 00:29:15

标签: android xml android-fragments preferences

我有两个(第一个和最后一个见过)我的XML中的切换首选项默认为" true"其余的"假。"

XML

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="Radar">
        <SwitchPreference
            android:defaultValue="true"
            android:key="current_radar"
            android:title="Current Radar"/>
        <SwitchPreference
            android:defaultValue="false"
            android:key="current_satellite"
            android:title="Current Satellite"/>
    </PreferenceCategory>
    <PreferenceCategory
        android:title="Maps">
        <SwitchPreference
            android:defaultValue="false"
            android:key="fire"
            android:title="Fire"/>
        <SwitchPreference
            android:defaultValue="false"
            android:key="flood"
            android:title="Flood"/>
        <SwitchPreference
            android:defaultValue="false"
            android:key="hurricane"
            android:title="Hurricane"/>
        <SwitchPreference
            android:defaultValue="false"
            android:key="tornado"
            android:title="Tornado"/>
    </PreferenceCategory>
    <PreferenceCategory
        android:title="Social Media">
        <SwitchPreference
            android:defaultValue="true"
            android:key="twitter"
            android:title="Twitter"/>
    </PreferenceCategory>

</PreferenceScreen>

我希望这两个显示为真,但每次运行我的应用时它们都会显示为假。

这是我的

package com.example.user.weatherdashboardandroid;


import android.annotation.TargetApi;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.MenuItem;

/**
 * A {@link PreferenceActivity} that presents a set of application settings. On
 * handset devices, settings are presented as a single list. On tablets,
 * settings are split by category, with category headers shown to the left of
 * the list of settings.
 * <p>
 * See <a href="http://developer.android.com/design/patterns/settings.html">
 * Android Design: Settings</a> for design guidelines and the <a
 * href="http://developer.android.com/guide/topics/ui/settings.html">Settings
 * API Guide</a> for more information on developing a Settings UI.
 */
public class DataFeeds extends AppCompatPreferenceActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new GeneralPreferenceFragment()).commit();

    }

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

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class GeneralPreferenceFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_general);
            setHasOptionsMenu(true);

        }

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

我发现其他类似性质的问题,例如this建议使用: `

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

在这个类的OnCreate中,我的MainActivity和上面显示的片段(上下文是片段&#39; OnCreate中的getActivity()),但没有一个对我有用。

随机地,Fire开关即使默认为false也会显示。是否有一些问题可能是因为一个班级有太多开关?

如何解决我的问题?

3 个答案:

答案 0 :(得分:1)

好的,这令人沮丧。显然,在更改SwitchPreference defaultValue之后,必须将Android Studio中的XML视图从Text切换到Design。这需要半秒钟,但随后您会看到Switch移动到它的预期位置。那么,当你重新安装应用程序时,它的工作原理。 WTF。我已经多次尝试过来证实这一点。这是列在doc的某个地方吗?

答案 1 :(得分:0)

尝试在GeneralPreferenceFragment的onCreate方法中添加这些行。

SwitchPreference currentRadarPref = (SwitchPreference) getPreferenceManager().findPreference("current_radar");
currentRadarPref.setChecked(getPreferenceManager().getSharedPreferences().getBoolean("current_radar", true));

SwitchPreference twitterPref = (SwitchPreference) getPreferenceManager().findPreference("twitter");
currentRadarPref.setChecked(getPreferenceManager().getSharedPreferences().getBoolean("twitter", true));

如果上述代码不适合您,请按照以下步骤操作:

首先删除来自首选项xml文件的这两个SwitchPreferences的 defaultValue 属性。

然后在GeneralPreferenceFragment的onCreate方法中添加以下代码:

Boolean defaultValue = true;

SwitchPreference currentRadarPref = (SwitchPreference) getPreferenceManager().findPreference("current_radar");    
currentRadarPref .setDefaultValue(defaultValue);
currentRadarPref.setChecked(getPreferenceManager().getSharedPreferences().getBoolean("current_radar", true));

SwitchPreference twitterPref = (SwitchPreference) getPreferenceManager().findPreference("twitter");
twitterPref.setDefaultValue(defaultValue); 
twitterPref.setChecked(getPreferenceManager().getSharedPreferences().getBoolean("twitter", true));

答案 2 :(得分:0)

你尝试过这个:

PreferenceManager.setDefaultValues(this, R.xml.pref_general, false);

而不是:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);