在 Activity 中使用片段时出现 NullPointerException
NullPointerException when using fragment in Activity
我的 activity 中有一些片段。
private MainFragment mMainFragment;
... //other fragments
这是我的 PagerAdapter。
private class MainPagerAdapter extends FragmentPagerAdapter {
...
@Override
public Fragment getItem(int position) {
if (DEBUG) {
Log.w(TAG, "position: " + position);
}
if (position == 0) {
mMainFragment = MainFragment.newInstance(PAGE_MAIN_INDEX);
return mMainFragment;
}
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
}
有时,当我的应用进入后台时,系统会终止 activity,然后如果我的应用 return 进入前台,系统会尝试恢复我的页面。看起来一切都很好,每个视图都正确显示。
但是当我尝试刷新我的片段时,我的应用程序崩溃了。日志显示片段为空。我不明白为什么。有什么想法吗?
这是我的 Fragment.onCreate(Bundle savedInstanceState)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = (SubmitTenderActivity) getActivity();
mInflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mResources = getResources();
}
最好在片段中使用以下方法:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
我认为您应该将 return mMainFragment 移出方法 getItem 中的 if 语句。
你为什么不试试这个?它对我来说很好用。
public class UpdateTabsAdapter extends FragmentPagerAdapter {
public UpdateTabsAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new AcademicDocumentsFragment();
case 1:
return new EmployementDocumentsFragment();
case 2:
return new UploadPhotoDetailsFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
尝试这样的事情
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return new Fragment1();
case 1:
return new Fragment2();
default:
break;
}
return null;
}
当框架正在恢复片段时,getItem()
不会再次调用,因此您的 mMainFragment
在恢复后为空。 instantiateItem()
方法会为框架正在恢复的每个片段调用,因此您必须在此方法中再次重新分配 mMainFragment。按以下方式更改代码应该可以解决您的问题:
private class MainPagerAdapter extends FragmentPagerAdapter {
...
@Override
public Fragment getItem(int position) {
if (DEBUG) {
Log.w(TAG, "position: " + position);
}
if (position == 0) {
mMainFragment = MainFragment.newInstance(PAGE_MAIN_INDEX);
return mMainFragment;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
if (position == 0) {
mMainFragment = (MainFragment)obj;
}
return obj;
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
}
我的 activity 中有一些片段。
private MainFragment mMainFragment;
... //other fragments
这是我的 PagerAdapter。
private class MainPagerAdapter extends FragmentPagerAdapter {
...
@Override
public Fragment getItem(int position) {
if (DEBUG) {
Log.w(TAG, "position: " + position);
}
if (position == 0) {
mMainFragment = MainFragment.newInstance(PAGE_MAIN_INDEX);
return mMainFragment;
}
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
}
有时,当我的应用进入后台时,系统会终止 activity,然后如果我的应用 return 进入前台,系统会尝试恢复我的页面。看起来一切都很好,每个视图都正确显示。
但是当我尝试刷新我的片段时,我的应用程序崩溃了。日志显示片段为空。我不明白为什么。有什么想法吗?
这是我的 Fragment.onCreate(Bundle savedInstanceState)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = (SubmitTenderActivity) getActivity();
mInflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mResources = getResources();
}
最好在片段中使用以下方法:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
我认为您应该将 return mMainFragment 移出方法 getItem 中的 if 语句。
你为什么不试试这个?它对我来说很好用。
public class UpdateTabsAdapter extends FragmentPagerAdapter {
public UpdateTabsAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new AcademicDocumentsFragment();
case 1:
return new EmployementDocumentsFragment();
case 2:
return new UploadPhotoDetailsFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
尝试这样的事情
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return new Fragment1();
case 1:
return new Fragment2();
default:
break;
}
return null;
}
getItem()
不会再次调用,因此您的 mMainFragment
在恢复后为空。 instantiateItem()
方法会为框架正在恢复的每个片段调用,因此您必须在此方法中再次重新分配 mMainFragment。按以下方式更改代码应该可以解决您的问题:
private class MainPagerAdapter extends FragmentPagerAdapter {
...
@Override
public Fragment getItem(int position) {
if (DEBUG) {
Log.w(TAG, "position: " + position);
}
if (position == 0) {
mMainFragment = MainFragment.newInstance(PAGE_MAIN_INDEX);
return mMainFragment;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
if (position == 0) {
mMainFragment = (MainFragment)obj;
}
return obj;
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
}