在 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;
    }
}