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

273
19 октября 2017, 08:59

в активити есть 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  

как же их получить?

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

Т.е. вы можете перенести код из конструктора фрагмента в метод onCreateView и тогда всё должно заработать.

И обязательно надо переименовать все классы и переменные чтобы код стал читаемым для джавистов.

READ ALSO
Android. Глюк Ripple Effect в TabLayout с FloatingActionButton

Android. Глюк Ripple Effect в TabLayout с FloatingActionButton

Имеется две вкладки, реализованные через TabLayout, ViewPager и FragmentПри отображении первой вкладки показывается кнопка FloatingActionButton

274
Set вне одного активити [требует правки]

Set вне одного активити [требует правки]

Можно ли данные из одной коллекции Set использовать в разных активити?

191
Приложение работает не на всех версиях android. Android Studio

Приложение работает не на всех версиях android. Android Studio

Запускается приложение вроде как на всем версиях андройда до API 15, как собственно и указал в манифестеНо вот есть одна проблема, когда нажимаю...

351
почему Java stack memory быстрее heap

почему Java stack memory быстрее heap

почему доступ к объектам в стэке быстрее чем к объектам вне стэка ?

299