当我尝试从片段中启动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);
答案 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);