从fragment调用sharedPref时,上下文出现NullPointerException错误

时间:2015-06-20 11:18:04

标签: android android-fragments

当我尝试从片段中启动NullPointerException初始化时,我在上下文中不断获得SharedPreference

这是错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
            at c.c.modular.SessionManager.<init>(SessionManager.java:68)
            at c.c.ProfileCompletedFragment.setupData(ProfileCompletedFragment.java:75)
            at c.c.ProfileCompletedFragment.passDataToFragment(ProfileCompletedFragment.java:210)
            at c.c.ProfileActivity.onCreate(ProfileActivity.java:287)

这是初始化程序:

// init
    public SessionManager(Context context) {
        this._context = context;

            pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
            editor = pref.edit();

    }

以下是片段中的调用:

private void setupData() {
        //sessions manager
        session = new SessionManager(getActivity());

        //establishing db
        db = new DatabaseHelper(getActivity());

        count = 0;

    }

编辑:

我已经意识到getActivity是null,因为片段尚未附加到活动本身,试图找出如何附加它以便我可以调用活动...这是我在下面编辑中的新尝试......同样的问题......

 profileJoinedFrag = new ProfileJoinedFragment();
        profileCompletedFrag = new ProfileCompletedFragment();
        android.support.v4.app.FragmentManager fm = getSupportFragmentManager();

        fm.beginTransaction()
                .replace(R.id.frame_container, profileCompletedFrag).commit();

        //Setting up fragment
        String[] tabTitles =  {"Posts", "Joins"};
        adapter = new TabAdapter(fm, profileCompletedFrag, profileJoinedFrag, tabTitles);

//        // Initialize the ViewPager and set an adapter
        pager = (ViewPager) findViewById(R.id.profilePager);
        pager.setAdapter(adapter);

        // Bind the tabs to the ViewPager
        tabs = (PagerSlidingTabStrip) findViewById(R.id.profileTabs);
        tabs.setViewPager(pager);

        //default place send
        //

        pager.setCurrentItem(0);
        profileCompletedFrag.passDataToFragment(userId);

5 个答案:

答案 0 :(得分:2)

使用getActivity().getApplicationContext().getSharedPreferences("name",Context.MODE_PRIVATE);代替上下文使用应用程序上下文

答案 1 :(得分:1)

您正在将null传递给SessionManager,因为getActivity()正在返回null。这意味着当您运行Fragment时,Activity未附加到任何setupData()

尝试在setupData()方法上调用Fragment,该方法仅在Fragment附加onCreate()时才会运行,例如onCreateView()Fragment

查看Fragment Lifecycle并选择一种在您的代码中有意义的方法。

修改

我可以看到你试图通过调用Fragment上的方法将参数传递给Bundle。正确的方法是传递Fragment f = new MyFragment(); Bundle args = new Bundle(); args.putInt("userId", userId); f.setArguments(args); ,如下所示:

Fragment

然后在onCreate()的{​​{1}}:

Bundle args = getArguments();
int userId = args.getInt("userId", 0);
//... Do whatever with the argument
setupData();

就像我之前说的那样,如果您在setupData()内拨打onCreate()方法,则getActivity()来电将不会返回null

答案 2 :(得分:0)

使用以下代码初始化

SharedPreferences preferences = this.getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);

而不是session = new SessionManager(getActivity());

答案 3 :(得分:0)

在接受MadEqua提到的内容之后,如果其他人正在寻找解决方案,我已经解决了这个问题......

我从片段到活动添加了一个通信器,并为片段添加了附加方法。

因此,一旦片段附加到活动,就会调用活动来启动要传递给片段的id ...就像这样:

片段:

//since fragment is loaded before activity
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        setupData();

        //TODO depending which frag to start on then have it make this call
        ((ProfileActivity) getActivity()).passDataToActivity(true);
    }

Activity(实现activityCommunicator接口):

@Override
    public void passDataToActivity(Boolean someValue) {
            profileJoinedFrag.passDataToFragment(userId);
    }

答案 4 :(得分:0)

使用SharedPreferences preferences = getContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);