2016-09-01 4 views
-1

У меня возникла проблема с SharedPreferences, которая является довольно странной.Не удается получить значения из SharedPreferences, logcat ничего не показывает

У меня есть активность, которая содержит фрагмент в ViewPager. Фрагмент показывает значок и текст. Вы можете изменить значок (флажок или крест, флажок по умолчанию) и текст, отображаемый в этом фрагменте из другого действия.

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

Итак, я попытался добиться этого с помощью SharedPreferences, но когда я его попробовал, мой фрагмент не показывал мне текст, хотя у меня установлены значения по умолчанию, и значок всегда является крестом, независимо от того, что было раньше, и хотя значок по умолчанию должен быть галочкой.

Я сохраняю значения в onActivityCreated() моего Фрагмента, когда он создан с данными, введенными пользователем в действие раньше.

Экономия:

SharedPreferences sharedPref = getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE); 
      SharedPreferences.Editor editor = sharedPref.edit(); 

//Here I am getting the values I want to save from a bundle, city and country... 

editor.putString("savedCity", city); 
editor.putString("savedCountry", country); 
editor.putString("fragmentSaved", "yes"); 

editor.apply(); 

Тогда я получаю значение в onCreate() моей деятельности, которая содержит фрагмент:

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPref.edit(); 

//adding fragment that was created with user input 

String ifAdded = sharedPref.getString("addedFragment", "no"); 

    if(ifAdded.equalsIgnoreCase("yes")){ 
     Bundle extras = getIntent().getExtras(); 

     StatusFragment newFragment = new StatusFragment(); 
     newFragment.setArguments(extras); 

     mSectionsPagerAdapter.addFragment(newFragment, extras.getString("city")); 

     editor.putString("addedFragment", "no"); 

     editor.apply(); 
    } 

    //Adding a saved fragment after restart 

    String storedSave = sharedPref.getString("fragmentSaved", "no"); 

    if (storedSave.equalsIgnoreCase("yes")){ 
     String storedCity = sharedPref.getString("savedCity", "somecity"); 
     String storedCountry = sharedPref.getString("savedCountry", "somecountry"); 

     Bundle saves = new Bundle(); 

     StatusFragment savedFragment = new StatusFragment(); 

     saves.putString("city", storedCity); 
     saves.putString("country", storedCity); 

     savedFragment.setArguments(saves); 

     mSectionsPagerAdapter.addFragment(savedFragment, saves.getString("city")); 
    } 

В деятельности, где создаются данные фрагменты, у меня есть это :

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE); 
        SharedPreferences.Editor editor = sharedPref.edit(); 

        editor.putString("addedFragment", "yes"); 

        editor.apply(); 

        fragmentHolder.putExtras(bundle); 
        startActivity(fragmentHolder); 

bundle имеет значения типа пользователя d in и fragmentHolder - это активность, которая содержит фрагмент.

Я искал ответы на различные вопросы здесь, на StackOverflow, но ни один из них не работает для меня, как:

Cannot get value from sharedpreferences

Shared Preferences get lost after shutting down device or killing the app

Shared Preferences reset data when app is force closed or device is restarted

SharedPreferences return only default value

SharedPreferences return only default value

Shared preference always taking default value

SharedPreferences keep getting default value

Извините, если я это, возможно, что-то тривиальное, но я не работал с фрагментами много, и я использую SharedPreferences в первый раз, в настоящее время.

Буду благодарен за каждый полезный ответ.

+0

где вы извлекаете значение sharedpreference ??? Я не вижу никакого кода для этого –

+0

, что должно делать это условие? 'if (getResources(). getString (R.string.pref_fragment_saved) .equals (« Да »)) {' вы знаете, что он всегда будет либо «true», либо «false» на основе значения 'R.string.pref_fragment_saved 'at'/values ​​/ strings.xml', который не может меняться во время выполнения. – Yazan

+0

Как мы можем получить доступ к общим привилегиям, как это в вашем коде? 'SharedPreferences sharedPref = getActivity(). GetPreferences (Context.MODE_PRIVATE);' –

ответ

0

Проблема решена сейчас. Мне пришлось использовать getActivity().getApplicationContext().getSharedPreferences("com.fragmentdata.myapp", Activity.MODE_PRIVATE);, и некоторые из моих переменных в пучках и предпочтениях перепутались. Я исправил это, и теперь он отлично работает :) Спасибо за ваши ответы.

-1

Вы хотите использовать этот

SharedPreferences sharedPref = ...; 
extras.putString("city", sharedPref.getString(getResources().getString(R.string.pref_saved_city), "")); 

в методе onCreate

0

Вы перепутать вещи, которые хранятся в вашем SharedPreference и внутри ваших приложений ресурсов (strings.xml)

editor.putString(getString(R.string.pref_fragment_saved), "Yes");

Эта строка сохраняет строку внутри вашего предпочтения XML, но тогда y НУ попытаться прочитать его как

getResources().getString(R.string.pref_fragment_saved).equals("Yes")

Что на самом деле просто считывает значение R.string.pref_fragment_save из вашего strings.xml

правильный способ читать то, что вы сохранили бы

getActivity().getPreferences(Context.MODE_PRIVATE).getString(getResources().getString(R.string.pref_fragment_saved), "defaultValue")

или А разрядный очиститель:

SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE); 
String key_frag_saved = getResources().getString(R.string.pref_fragment_saved); 

String storedString = prefs.getString(key_frag_saved, "defValue"); 

if (storedString.equalsIgnoreCase("yes")) {...} 

И таким же образом вы могли бы прочитать другие сохраненные значения из вашего экземпляра объекта SharedPreference.

+0

Кажется, что-то снова не так:/Я получаю фрагмент с только значениями по умолчанию. Я обновил свой вопрос с помощью своего нового кода. – boehmP

+0

@boehmP Если я правильно прочитал, вы читаете значения в 'onCreate()' Activity, где хранится фрагмент, который сохраняет информацию? Вы возобновили активность, чтобы узнать, была ли загружена информация? И вы уверены, что вызов 'onCreate' снова вызван? Добавьте сообщения Log.i для загрузки и сохранения и проверьте порядок его выполнения. –

+0

Когда я добавляю фрагмент, я получаю следующие логические выходы: I/Загрузка: Фрагмент загружен, I/Сохранение: Фрагмент сохранен, I/Сохранение: Фрагмент сохранен. Он по какой-то причине сохраняет его дважды, и когда я закрываю приложение и перезапускаю его, он имеет тот же результат, но у меня нет текста и значка креста, хотя у меня есть значения по умолчанию. Я понятия не имею, почему все пропущено? – boehmP

Смежные вопросы