2

I have a fragment A, containing a listview. To this listview I add a listheader containing a ViewPager that pages through childfragments.

When the user clicks an item in the list, the listfragment A gets replaced by a detail-view-fragment of that listitem.

I want the user to be able to go back to the list by clicking the back button.

So far everything works, except when the user presses the back button to pop the detail fragment from the stack to get back to the listview fragment A, the app crashes with an

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}

My suspicion is, that maybe the nested fragments for the viewpager in the listheader get recreated before the viewpager gets recreated, thus crashing the app, but I am not sure.

Any help is appreciated!

My ViewPagerAdapter for the listheader-viewpager (removed some unrelated code):

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

My news detail fragment (pretty straight forward):

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

My viewpager is declared in xml in a row-layout and added like so:

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);
    }
}
A. Steenbergen
  • 3,360
  • 4
  • 34
  • 51

1 Answers1

0

Are you sure tha you use the right FragmentManager in addHeaderPager()?

I normally use getFragmentManager() and if there is a parent fragment I have to use getParentFragment().getFragmentManager() - if I don't I get the same error ("No view found for id") when trying to replace the current visible fragment.

The incredible Jan
  • 741
  • 10
  • 17