ViewPager片段未在onCreate中启动 [英] ViewPager Fragments are not initiated in onCreate

查看:97
本文介绍了ViewPager片段未在onCreate中启动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

无论我尝试使用onCreate(),onCreateView()还是onResume(),似乎都无法更新ViewPager中使用的片段.这是我在MainFragment中设置ViewPager的方法:

I seem to be having an issue updating the fragments that I am using in my ViewPager, regardless of whether I try in onCreate(), onCreateView(), or onResume(). Here is how I'm setting up my ViewPager in my MainFragment:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.fragment_main_screen, container, false);

        mPager = (ViewPager)rootView.findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(2); // So all 3 pages are loaded at once.
        mAdapter = new JournalPagerAdapter(getActivity().getSupportFragmentManager(), this);
        mPager.setAdapter(mAdapter);

        // Add bar graph to view
        mGraphLayout = (LinearLayout) rootView.findViewById(R.id.journalGraph);
        updateGraph();
        mGraphLayout.addView(mGraphView);

        mPainFrag = (PainFragment)mAdapter.getRegisteredFragment(0);
        // Null pointer here, but if I put the action in a button listener, it works.
        mPainFrag.setScale(mEntry.getPain());
...

我正在通过FragmentPagerAdapter中的某些重写方法访问这些片段:

I'm accessing the fragments through some overridden methods in my FragmentPagerAdapter:

public class JournalPagerAdapter extends FragmentPagerAdapter {

    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
    private View.OnClickListener mOnClickListener;


    public JournalPagerAdapter(FragmentManager mgr, View.OnClickListener onClickListener) {
        super(mgr);
        mOnClickListener = onClickListener;
    }
    @Override
    public Fragment getItem(int pos) {
        switch(pos) {

            case 0: return PainFragment.newInstance("PainFragment", mOnClickListener);
            case 1: return StressFragment.newInstance("StressFragment", mOnClickListener);
            case 2: return SleepFragment.newInstance("SleepFragment", mOnClickListener);
            default: return PainFragment.newInstance("PainFragment", mOnClickListener);
        }
    }

    @Override
    public int getCount() {
        return 3;
    }

    /* Thanks to Streets of Boston (http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager)
    */

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Log.v("rx", "itemInstantiated");
        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);
    }

设置适配器后,我似乎无法弄清为什么片段为空,但是如果将片段更新代码放在click事件中,则不会有任何问题.

I can't seem to figure out why the fragment is null right after I set the adapter, but if I put the fragment update code in a click event, I have no issues.

推荐答案

我会尝试在您的ViewPager中添加布局侦听器,以在发生视图布局时得到通知.

I would try adding a layout listener to your ViewPager to get notified when the laying out of views has occurred.

创建ViewPager时,调用mPager.getViewTreeObserver().addOnGlobalLayoutListener()并传递实现OnGlobalLayoutListener的内容.

When you create your ViewPager call mPager.getViewTreeObserver().addOnGlobalLayoutListener() and pass something implementing OnGlobalLayoutListener.

在回调方法中,执行片段更新.确保在回调中调用mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this),否则将多次调用该回调.

In the callback method, do your fragment updating. Make sure to call mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this) in the callback, otherwise the callback will be called multiple times.

这篇关于ViewPager片段未在onCreate中启动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆