android - ViewPager Fragments 未在 onCreate 中启动

标签 android android-fragments android-viewpager

无论我是在 onCreate()、onCreateView() 还是 onResume() 中尝试,我似乎在更新我在 ViewPager 中使用的 fragment 时遇到问题。以下是我在 MainFragment 中设置 ViewPager 的方式:

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 中的一些重写方法访问 fragment :

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

我似乎无法弄清楚为什么在设置适配器后 fragment 立即为空,但是如果我将 fragment 更新代码放在单击事件中,我就没有问题。

最佳答案

我会尝试向您的 ViewPager 添加一个布局监听器,以便在发生 View 布局时收到通知。

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

在回调方法中,进行 fragment 更新。确保在回调中调用mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this),否则回调会被多次调用。

关于android - ViewPager Fragments 未在 onCreate 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997205/

相关文章:

android - 约束布局中的按钮未拉伸(stretch)到父级

java - 无法删除另一 fragment 中的子 fragment

android - 如何在ViewPager中实现可缩放的ImageView?

android - 为什么 ViewPager 在 Android Studio 设计模式下出错?

android - 为什么创建虚拟表需要OPEN_READWRITE模式?

android - 信用卡的正确输入类型

java - 在java代码中使用相对布局

android - 强制关闭 : I have created a simple app with two fragments where fragemnt A is sendind data/string to Fragment B

android - 使用 Fragment 内的方法更改 TextView 值 (NullPointerException)

android - 如何从 URL 加载图像到 viewpager