【问题标题】:Nested fragments: java.lang.IllegalArgumentException: No view found for id嵌套片段:java.lang.IllegalArgumentException:找不到 id 的视图
【发布时间】:2014-08-03 11:14:34
【问题描述】:

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

当用户点击列表中的某个项目时,列表片段 A 会被该列表项的详细视图片段替换。

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

到目前为止一切正常,除了当用户按下后退按钮从堆栈中弹出详细信息片段以返回列表视图片段 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 的嵌套片段,从而导致应用程序崩溃,但我不确定。

感谢任何帮助!

我的 Listheader-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);
    }
}

【问题讨论】:

  • 你有没有解决这个问题,我也遇到了同样的问题

标签: android android-viewpager fragment


【解决方案1】:

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

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

【讨论】:

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