Как загрузить значение предпочтения по умолчанию в PreferenceFragment?

У меня есть два (первый и последний, показанные ниже). Настройки переключателя в моем XML-файле по умолчанию имеют значение «истина», а остальные - «ложь».

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 и фрагмент, показанный выше (контекст - getActivity () внутри OnCreate фрагмента), но ни один из них у меня не работает.

В случайном порядке переключатель «Пламя» оказывается включенным, хотя по умолчанию он установлен в положение «ложь». Возможно, есть проблема с наличием слишком большого количества переключателей для одного класса?

Как мне решить мою проблему?


person braj    schedule 15.04.2017    source источник
comment
я запускаю PreferenceManager.setDefaultValues ​​(this, R.xml.preference, false); в моем классе приложения   -  person buradd    schedule 15.04.2017
comment
Я пробовал добавить его в класс, фрагмент, класс MainActivity ... ничего   -  person braj    schedule 15.04.2017


Ответы (3)


Хорошо, это расстраивает. По-видимому, после изменения значения defaultValue для SwitchPreference необходимо переключить представление XML в Android Studio с текста на дизайн. Это занимает полсекунды, но затем вы видите, что переключатель перемещается в нужное положение. ТОГДА, когда вы переустанавливаете приложение, оно работает. Какого черта. Я пробовал это много раз, чтобы подтвердить это. Это где-то указано в документе?

person braj    schedule 15.04.2017

вы пробовали это:

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

вместо этого:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);
person buradd    schedule 15.04.2017
comment
этот пример был процитирован из ссылки, которую я дал - person braj; 15.04.2017

Попробуйте добавить эти строки в свой метод onCreate для GeneralPreferenceFragment.

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

Если приведенный выше код не работает для вас, выполните следующие действия:

Сначала удалите атрибут defaultValue этих двух SwitchPreferences из XML-файла настроек.

Затем добавьте следующий код в метод onCreate вашего GeneralPreferenceFragment:

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));
person KrzyShzy    schedule 15.04.2017
comment
попробуйте с этим SwitchPreference currentRadarPref = (SwitchPreference) getPreferenceManager (). findPreference (current_radar); currentRadarPref.setChecked (true); и скажите, включен переключатель или нет. - person KrzyShzy; 15.04.2017
comment
Да, это сработало! Большое тебе спасибо! Значит, бессмысленно устанавливать значение по умолчанию в XML? Вы знаете, почему по-другому не сработало? - person braj; 15.04.2017
comment
вам не следует использовать жесткое значение, такое как истина или ложь. На самом деле я сказал вам использовать точное значение, чтобы найти проблему. Теперь я знаю причину проблемы. Просто попробуйте еще раз с сегментами кода, которые я написал ранее, с помощью метода getBoolean в вашем методе oncreate. Удалите приложение на своем устройстве вручную, а затем запустите приложение из студии Android. Это будет работать. - person KrzyShzy; 15.04.2017
comment
Просто удалил и попробовал с исходным кодом. Он снова не работает - person braj; 15.04.2017
comment
Привет, брадж, я обновил свой ответ. Попробуйте сами. Также не забудьте удалить приложение вручную, прежде чем переустанавливать приложение из студии Android. Надеюсь, на этот раз это сработает. - person KrzyShzy; 15.04.2017
comment
Обновление: я уже несколько часов пробовал множество альтернатив. Единственная случайная разница, которая иногда проявлялась изначально, заключается в том, что переключатель Fire иногда действительно включен, даже если его значение по умолчанию - false. Понятия не имею, почему это происходит. Есть ли что-то странное в том, что для одного класса слишком много переключателей? - person braj; 15.04.2017
comment
Не думаю, что проблема в количестве переключателей. Вы можете попробовать CheckBoxPreference вместо SwitchPreference. Я также использую CheckBoxPreferences в своем приложении, и они работают без проблем. - person KrzyShzy; 15.04.2017
comment
Большое спасибо за вашу помощь! - person braj; 15.04.2017
comment
Хорошо, это расстраивает. По-видимому, после изменения значения defaultValue для SwitchPreference необходимо переключить представление XML в Android Studio с текста на дизайн. Это занимает полсекунды, но затем вы видите, что переключатель перемещается в нужное положение. ТОГДА, когда вы переустанавливаете приложение, оно работает. Какого черта. Я пробовал это много раз, чтобы подтвердить это. Это где-то указано в документе? - person braj; 15.04.2017
comment
Теперь я также попытался изменить значения по умолчанию и запустил приложение, не переключаясь на вкладку дизайна, я заметил, что при запуске 2-3 раза он не отражал никаких изменений в моем приложении, но затем я переключился на вкладку дизайна и запустил приложение. как ни странно, и на этот раз он не отразил никаких изменений (странный Ikr), тогда я очистил проект и запустил его снова, и на этот раз все изменения были видны, и после этого каждый раз изменения отображаются в приложении, даже не переключаясь в представление дизайна . Итак, очистите проект, и вы также можете открыть окно предварительного просмотра на половине экрана с правой боковой панели. - person KrzyShzy; 15.04.2017