在Activity中使用片段时出现NullPointerException

时间:2015-02-04 04:16:43

标签: android android-fragments android-viewpager

我的活动中有一些片段。

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

有时,当我的应用程序转到后台时,系统会终止活动,然后如果我的应用程序返回到前台,系统会尝试恢复我的页面。看起来一切都很好,每个视图都能正确显示。
但是当我尝试刷新我的片段时,我的应用程序崩溃了。日志显示片段为空。我不知道为什么。有什么想法吗?

这是我的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();
}

5 个答案:

答案 0 :(得分:1)

尝试这样的事情

 @Override
public Fragment getItem(int position) {
    switch(position){
        case 0:

            return new Fragment1();
        case 1:
            return new Fragment2();
        default:
            break;
    }

    return null;
}

答案 1 :(得分:1)

当框架恢复Fragment时,

getItem()不再被调用,因此恢复后mMainFragment为空。对于框架正在恢复的每个Fragment调用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;
    }
}

答案 2 :(得分:0)

最好在片段中使用以下方法:

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }

答案 3 :(得分:0)

我认为你应该将返回的mMainFragment移出方法getItem中的if语句。

答案 4 :(得分:0)

为什么不试试这个?它对我来说很好。

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