使用getRegisteredFragment在Android中的ViewPager中获取片段将返回null

时间:2015-05-18 15:40:47

标签: android-fragments android-viewpager fragmentpageradapter

我一直在搜索,但我无法使其发挥作用。

我尝试使用制表符在viewpager中获取片段时遇到问题。

我已经实现了SparseArray,因为我在这里阅读了几个方法,但是我无法使其工作。

事情是每次我调用adapter.getRegisteredFragment(position)..我总是收到null,除非我在tabsStrip的onPageSelected事件中创建它,它有效..但我不想得到片段在那里。

这些是我的课程:

我的片段:

 return $resource('app/prcs/rest/process/getERhHirachyInfo/:id', {}, {
        'query': {
            method: 'GET'
        },
        'get': {
            method: 'GET'
        }
    });

我的适配器:

public class WeekFragment extends Fragment implements View.OnClickListener
{
    private static final String ARG_POSITION = "position";

    private int position;

    private LinearLayout[] btns;

    public static WeekFragment newInstance(int position) {
        WeekFragment f = new WeekFragment();
        Bundle b = new Bundle();
        b.putInt(ARG_POSITION, position);
        f.setArguments(b);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        position = getArguments().getInt(ARG_POSITION);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        fillFragment();
    }

    private void fillFragment()
    {
        // Irrelevant stuff..
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance)
    {
        return inflater.inflate(R.layout.week_fragment, container, false);
    }

    @Override
    public void onClick(View v)
    {
        // Irrelevant stuff
    }

    public LinearLayout[] getBtns()
    {
        return btns;
    }

    public void setBtns(LinearLayout[] btns)
    {
        this.btns = btns;
    }
}

和我的活动:

public class WeekAdapter extends FragmentPagerAdapter
{
    Calendar cal;
    Context context;
    SparseArray<Fragment> registeredFragments;

    private String[] TITLES = new String[6];

    public WeekAdapter(FragmentManager fm, Context context)
    {
        super(fm);
        registeredFragments = new SparseArray<>();
        this.context = context;
        fillTitles();
    }

    private void fillTitles()
    {
        // Fill titles
    }


    @Override
    public CharSequence getPageTitle(int position)
    {
        return TITLES[position];
    }

    @Override
    public int getCount()
    {
        return TITLES.length;
    }

    @Override
    public Fragment getItem(int position)
    {
        return WeekFragment.newInstance(position);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }
}

每当我在我的活动中调用adapter.getRegisteredFragment(position)时它会崩溃,因为它总是返回null ..

我发誓,我一直在搜索,但我无法让它发挥作用。

非常感谢大家!

2 个答案:

答案 0 :(得分:0)

我认为我的问题是我在我的活动的onCreate中调用了这个adapter.getRegisteredFragment(position),而在onCreate中,viewpager仍然没有完全加载,并且仍未实例化registeredFragments,因此列表仍然是空的..

如果在viewpager完全加载时将此调用移动到其他位置,它将起作用。

答案 1 :(得分:0)

registeredFragments中的项目用instantiateItem()方法初始化,应在绘制视图的过程中调用该方法。并且此绘制过程发生在onCreate()/ onResume()之后。 我不确定要通过在onCreate()中获取Fragment来做什么,但是通常这不是一个好主意,因为Fragment当时还没有初始化。如您所说,您应该访问onPageSelected()中的片段。