Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

получить getSharedPreferences из Fragment

в активити есть TabLayout с ViewPager'ом, в который адаптер должен загружать 2 страницы xml
user_favs.java
userFavsAdapter favsAdapter=new userFavsAdapter(this,getSupportFragmentManager()); user_favs_viewpager.setAdapter(favsAdapter); user_favs_tablayout.setupWithViewPager(user_favs_viewpager);
userFavsAdapter.java extends FragmentPagerAdapter
@Override public Fragment getItem(int position) { if (position == 0) return new user_fav_stores(); else return new user_fav_items(); }
В SharedPreferences уже сохранена некоторая инфа. Ее нужно получить из фрагментов
user_fav_stores.java extends Fragment
String user_id=""; String user_stores="";
public user_fav_stores(){ SharedPreferences logininfo=getContext().getSharedPreferences(Values.APP_LOGIN_INFO,MODE_PRIVATE); /* или другие варианты */ SharedPreferences logininfo=this.getActivity().getSharedPreferences(Values.APP_LOGIN_INFO,MODE_PRIVATE); SharedPreferences logininfo=getContext().getSharedPreferences(Values.APP_LOGIN_INFO,MODE_PRIVATE); SharedPreferences logininfo=getContext().getApplicationContext().getSharedPreferences(Values.APP_LOGIN_INFO,MODE_PRIVATE); /* */ if(logininfo!=null){ if(logininfo.getString("auth_type","").equals("user")) { user_id=logininfo.getString("userid",""); user_stores=logininfo.getString("stores",""); } } }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root= inflater.inflate(R.layout.user_fav_stores, container, false); lv=(ListView)root.findViewById(R.id.user_fav_stores);
(new getUserStores()).execute(); return root; }
user_fav_items.java аналогично
Все варианты получить SharedPreferences дают
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.support.v4.app.FragmentActivity.getSharedPreferences(java.lang.String, int)' on a null object reference
как же их получить?


Ответ

Именовать в Java надо camelCase-ом, иначе ваш код становится нечитаемым. Имена классов должны быть с большой буквы. Конструкторы активити и фрагментов использовать нельзя. Это системные компоненты и система сама создаёт их экземпляры. Вы должны использовать только методы жизненного цикла этих компонентов. Получить контекст можно методом фрагмента getActivity(). Но только после того, как фрагмент будет добавлен в активити. Это произойдёт только после вызова onAttach(Context context) метода фрагмента (вызов будет сделан системой после выполнения асинхронной операции добавления фрагмента)
Т.е. вы можете перенести код из конструктора фрагмента в метод onCreateView и тогда всё должно заработать.
И обязательно надо переименовать все классы и переменные чтобы код стал читаемым для джавистов.

Комментариев нет:

Отправить комментарий