嵌套片段:java.lang.IllegalArgumentException:找不到id的视图

时间:2014-08-03 11:14:35

标签: android android-viewpager fragment

我有一个包含listview的片段A.在这个列表视图中,我添加了一个listheader,其中包含一个通过子片段分页的ViewPager。

当用户单击列表中的项目时,listfragment A将被该listitem的详细信息视图片段替换。

我希望用户能够通过单击后退按钮返回列表。

到目前为止一切正常,除非用户按下后退按钮从堆栈中弹出详细信息片段以返回listview片段A,应用程序崩溃

java.lang.IllegalArgumentException: No view found for id 0x7f06002e (com.makamedia.hockeyweb:id/news_header_pager) for fragment NewsHeaderFragment{41f7b6f8 #0 id=0x7f06002e android:switcher:2131099694:0}

我的怀疑是,可能在重新创建viewpager之前重新创建了listheader中viewpager的嵌套片段,从而导致应用程序崩溃,但我不确定。

感谢任何帮助!

我的Viewheader-viewpager的ViewPagerAdapter(删除了一些不相关的代码):

public class NewsHeaderAdapter extends FragmentPagerAdapter {
    private int mCount;
    public final NewsListAdapter mListAdapter;

    public NewsHeaderAdapter(FragmentManager fm, int count, long autoSwipeInterval, NewsListAdapter adapter) {
        super(fm);
        this.mCount = count;
        this.mListAdapter = adapter;
    }

    @Override
    public Fragment getItem(int pos) {
        return NewsHeaderFragment.getNew(this.mListAdapter.getItem(pos));
    }

    public void setCount(int newCount){
        if(newCount < 1){
            this.mCount = 1;
        } else if(newCount >= this.mListAdapter.getCount()){
            this.mCount = this.mListAdapter.getCount();
        } else {
            this.mCount = newCount;
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return this.mListAdapter.getItem(position).getTitle();
    }
}

我的新闻细节片段(非常简单):

public class NewsHeaderFragment extends Fragment {

private NewsItem mNewsItem;
private TextView mHeaderNewsBigTitle;
private ImageView mHeaderNewsBigImage;

// Convenience method for creating a new fragment with parameters
public static NewsHeaderFragment getNew(NewsItem item){
    NewsHeaderFragment fragment = new NewsHeaderFragment();
    Bundle args = new Bundle();
    args.putSerializable(Constants.SIG_NEWS_ITEM, item);
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.row_big_news, container, false);
    Bundle newsHeaderArgs = getArguments();
    mNewsItem = (NewsItem)newsHeaderArgs.getSerializable(Constants.SIG_NEWS_ITEM);
    setupUI(rootView);
    fillUI();
    return rootView;
}

private void fillUI() {
    mHeaderNewsBigTitle.setText(mNewsItem.getTitle());
    Picasso.with(getActivity()).load(mNewsItem.getImageBig2x()).into(mHeaderNewsBigImage);
}

private void setupUI(View rootView) {
    mHeaderNewsBigTitle = (TextView) rootView.findViewById(R.id.news_big_title);
    mHeaderNewsBigImage = (ImageView) rootView.findViewById(R.id.news_big_img);
}
}

我的viewpager在xml中以行布局声明,并添加如下:

private void addHeaderPager(int count) {
    if(mNewsListAdapter != null && mNewsListAdapter.getCount()>0) {
        if (count >= mNewsListAdapter.getCount()) {
            count = mNewsListAdapter.getCount() - 1;
        }
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mHeader = (RelativeLayout) inflater.inflate(R.layout.row_big_news_pager, null);
        mHeaderPager = (ViewPager) mHeader.findViewById(R.id.news_header_pager);
        mHeaderPagerAdapter = new NewsHeaderAdapter(getChildFragmentManager(), count, 6000, mNewsListAdapter);
        mHeaderPager.setOffscreenPageLimit(count);
        mHeaderPager.setAdapter(mHeaderPagerAdapter);
        // Bind the title indicator to the adapter
        CirclePageIndicator circleIndicator = (CirclePageIndicator) mHeader.findViewById(R.id.news_header_pager_indicator);
        circleIndicator.setViewPager(mHeaderPager);
        mNewsListView.addHeaderView(mHeader);
    }
}

1 个答案:

答案 0 :(得分:0)

您确定在addHeaderPager()中使用了正确的FragmentManager吗?

我通常使用getFragmentManager()如果有父片段,我必须使用getParentFragment().getFragmentManager() - 如果我不这样做,我会在尝试时遇到相同的错误(“找不到id的视图”)替换当前可见的片段。