【问题标题】:Why fragment onCreateView being called twice?为什么片段 onCreateView 被调用两次?
【发布时间】:2015-08-29 09:10:11
【问题描述】:

我正在使用 viewpager,但片段有问题。 我的片段 onCreateView 被调用了两次。 这是我的代码 适配器:

public class QuestionAdapter extends FragmentStatePagerAdapter {

/**
 * @param fm
 *            Fragment manager
 */
public QuestionAdapter(FragmentManager fm) {
    super(fm);

}

/*
 * (non-Javadoc)
 * 
 * @see android.support.v4.app.FragmentStatePagerAdapter#getItem(int)
 */
@Override
public Fragment getItem(int position) {

    if (position == 4) {

        return InfoFragment.getInstance();
    }

    return QuestionFragment.getInstance(position);
}

/*
 * (non-Javadoc)
 * 
 * @see android.support.v4.view.PagerAdapter#getCount()
 */
@Override
public int getCount() {

    return 5;
}

/*
 * (non-Javadoc)
 * 
 * @see
 * android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
 */
@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

我的片段代码:

public class QuestionFragment extends Fragment {

private int mPos;

@Bind(R.id.fragment_question_group_layout)
RadioGroup questionGroup;

public static QuestionFragment getInstance(int pos) {

    QuestionFragment fragment = new QuestionFragment();
    fragment.setPos(pos);
    return fragment;
}

public void setPos(int pos) {
    this.mPos = pos;
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {

    LogUtil.e("QuestionFragment", "Pos : " + mPos);
    View view = inflater.inflate(R.layout.fragment_question, container, false);
    ButterKnife.bind(this, view);

    switch (mPos) {

        case 0 :

            displayQuestion(getResources().getStringArray(R.array.question1_content));
            break;
        case 1 :

            displayQuestion(getResources().getStringArray(R.array.question2_content));
            break;
        case 2 :

            displayQuestion(getResources().getStringArray(R.array.question3_content));
            break;
        default :

            displayQuestion(getResources().getStringArray(R.array.question4_content));
            break;
    }

    return view;
}

这里是日志:

  • E/QuestionFragment:位置:0
  • E/QuestionFragment﹕位置:1
  • E/QuestionFragment:位置:2
  • E/QuestionFragment﹕位置:3
  • E/InfoFragment:位置:
  • E/QuestionFragment:位置:0
  • E/QuestionFragment:位置:0
  • E/QuestionFragment:位置:0
  • E/QuestionFragment:位置:0
  • E/InfoFragment﹕位置:

编辑: 我已经设置了:viewPager.setOffscreenPageLimit(4);关于活动 当我打开活动时,上面的日志得到了,没有滑动动作。只需打开活动并获取日志

【问题讨论】:

  • 我没有看到问题。每当(重新创建)片段时都会调用onCreateView()FragmentStatePagerAdapter 旨在动态创建和销毁片段。它还——默认情况下——只保留当前以及相邻的(左/右)片段。因此,在翻页时重新创建片段是正常的。
  • 问题是我已经设置了 viewPager.setOffscreenPageLimit(4);为什么在第二次通话中,我的 pos = 0?调试并在适配器的 getItem 上,我的片段刚刚调用了 1 次当我打开活动时也记录了上面的日志 - 不要刷寻呼机
  • 为什么在 getItemPosition() 中返回 POSITION_NONE 而不是 POSITION_UNCHANGED?
  • @JacobRas:我都试过了,但没有任何改变:(
  • 好吧,如果您没有具体理由使用 NONE,我会将其保留为默认的 UNCHANGED。查看您发布的日志输出,它们是否以确切的顺序出现(首先是 0,1,2,3,然后是 0,0,0,0)?另外:你什么时候得到这些日志输出?请描述您在设备上做什么、如何刷卡等等。

标签: android android-viewpager fragment


【解决方案1】:

我解决了我的问题,它是:

  • 我的手机方向是:纵向
  • 我的应用是:风景

当我运行我的应用程序时,由于配置更改,片段将重新创建。我放了

android:configChanges="keyboardHidden|screenSize|orientation"

在清单上然后一切正常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多