2015-03-31 5 views
0

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

onCreateView Функции

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     SharedPreferences loadSettings = getActivity().getSharedPreferences("app_setts", Context.MODE_PRIVATE); 
     Button counterBtn = (Button) getActivity().findViewById(R.id.counterBtn); 
     int countInt = loadSettings.getInt("counter",0); 
     counterBtn.setText(String.valueOf(countInt)); 

     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     return rootView; 
    } 

() Так как изменить значение переключателя, используя SharedPreference
* Я искал здесь, но все дает сбой
Извините за плохой английский

Редактировать 0
Я обнаружил, что я не мог получить доступ к компоненту фрагмента непосредственно OnCreate() в MainActivity.java так что я должен поместить свой код в onCreateView функции()

Но есть проблема
приложение работает и не сбой, но значение все равно не изменится
Любая идея решить эту проблему?

+1

Опубликовать свой Logcat. – Vijay

+1

Что означает «но все дает крах»? Исключение? Если да, покажите нам стек. – Seelenvirtuose

+0

Я имею в виду, что все методы, которые я использовал, приводят к сбою – MostafaZ4

ответ

0

Здесь есть пара вопросов.

Во-первых, вы должны перенести код из onCreateView() на свой объект onActivityCreated(), так как тогда вам гарантируется завершение работы onCreate.

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

Сайт Android разработчик имеет хорошую статью о том, как общаться между фрагментом и его активность через интерфейсы, в http://developer.android.com/training/basics/fragments/communicating.html

Лично я предпочитаю, чтобы расцепить вещи еще больше, отказаться от интерфейса, а также использовать шины сообщений (например, Otto, EventBus и т. д.). Таким образом, фрагменты полностью многоразовые/сменные, и ни деятельность, ни фрагмент не должны знать что-то конкретное друг о друге - только какие сообщения шины они испускают/потребляют.

+0

Его решение, да, это было связано с подключением фрагмента к основному виду деятельности, спасибо всем ... – MostafaZ4

0

След Logcat показывает, что 62-я линия бросает NPE.

boolean onoffSwitch = loadSettings.getBoolean("appOnOff", false); 

Таким образом, loadSettings должен быть пустым. Вы можете напечатать это следующим образом:

System.out.print(loadSettings); 

Таким образом, вы должны попробовать:

SharedPreferences loadSettings = getSharedPreferences("pref", Context.MODE_PRIVATE); 
... 
loadSettings.commit(); 
+0

Crash решена с помощью 'onCreateView()' вместо 'onCreate()' проблема - это setText didn ' t изменить текст кнопки – MostafaZ4

0

Вы можете попытаться получить общие значения предпочтение перед сохранением. Сначала проверьте, сохраняете ли вы значения по общим предпочтениям.

+0

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

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