【问题标题】:Viewpager not displaying menu items for first fragmentViewpager 不显示第一个片段的菜单项
【发布时间】:2017-05-30 20:47:53
【问题描述】:

我有列表项 onlcick 我带到 DetailActivity 的列表项。 DetailActivity 可以使用 viewpager 和 Fragments 进行滑动。问题是当 DetailActivity 打开并加载 Fragment 时没有显示菜单选项但是如果我向左或向右滑动我会得到菜单选项 然后当我返回到初始片段时,菜单项是可见的。

我正在夸大片段中的菜单选项。

详细活动

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_article_new);

        mViewPager = (CustomViewPager) findViewById(R.id.viewPager);

        int currentItemIndex = mNewsItemList.indexOf(newsItem);

        mArticleSwipeMap = new HashMap<>();
        mPagerAdapter = new ArticlePagerAdapter(getSupportFragmentManager());
        mPagerAdapter.swapList(mNewsItemList);
        mViewPager.setOnSwipeOutListener(this);
        mViewPager.setAdapter(mPagerAdapter);
        mViewPager.setCurrentItem(currentItemIndex);
        mViewPager.addOnPageChangeListener(this);
    }

适配器类

private class ArticlePagerAdapter extends FragmentStatePagerAdapter{
        private Map<Integer, ArticleFragment> mPageReferenceMap = new HashMap<>();
        private List<NewsItem> newsItemList;

        public ArticlePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            ArticleFragment articleFragment = ArticleFragment.newInstance(newsItemList.get(position));
            mPageReferenceMap.put(position, articleFragment);
            return articleFragment;
        }

        @Override
        public int getCount() {
            return newsItemList.size();
        }

        public void swapList(List<NewsItem> newsItemList){
            this.newsItemList = newsItemList;
            notifyDataSetChanged();
        }
    }

细节片段

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.toolbar_menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int itemId = item.getItemId();
        switch(itemId) {
            case R.id.action_more:
                View menuItemView = mRootView.findViewById(R.id.action_more);
                onMenuClick(menuItemView);
                break;
            case R.id.action_share:
                shareTextUrl();
                break;
        }
        return true;
    }

更新1:当我向左滑动时,当我向右滑动菜单项时不显示菜单项,现在如果我向左滑动菜单项就会显示。

它与设置 viewpager 有什么关系吗 这就是我在 Activity 的 onCrete 中设置 viewpager 的方式

mPagerAdapter = new ArticlePagerAdapter(getSupportFragmentManager());
        mPagerAdapter.swapList(mNewsItemList);
        mViewPager.setOnSwipeOutListener(this);
        mViewPager.setAdapter(mPagerAdapter);
        mViewPager.setCurrentItem(currentItemIndex);
        mViewPager.addOnPageChangeListener(this);

更新 2:

问题是当我使用自定义工具栏时它不起作用。当我与 DarkActionBar 一起使用时,它可以正常工作,但是当我将 NoActionBar 与我的自定义工具栏一起使用时,它会产生问题。 这是我创建的具有相同问题的示例项目 链接到githubhttps://github.com/KumarVelu/viewPagerDemo

【问题讨论】:

  • newsItem 的值是多少?从 0 开始还是从 1 开始?
  • newsItem 是对象。 mNewsItemList.indexOf(newsItem);将返回newsItem在mNewsItemList中的位置,从0开始。
  • 你在哪里调用 Fragment.setHasOptionsMenu(true) ?
  • 在片段的onCreate中。
  • 到目前为止您发布的代码看起来不错,错误可能在其他地方。您也可以尝试其他版本的支持库。

标签: android android-fragments android-viewpager android-menu


【解决方案1】:

问题是您试图设置多个主操作栏,因为每个片段都有自己的工具栏。因此,当 ViewPager 加载当前页面并预加载下一页时,您有 2 个 Fragment 试图将自己的 Toolbar 设置为主要 ActionBar,并且它们发生冲突。

如果您想将 Toolbar 用作主 Action Bar,请将 Toolbar 移动到 Activity 布局而不是 Fragments 布局中,并在 Activity 中初始化一次。

如果您想在每个片段中使用单独的工具栏,请不要将任何工具栏设置为主要操作栏,而是使用Toolbar.inflateMenu() 和Toolbar.setOnMenuItemClickListener()。然后,每个 Fragment 将直接在自己的 Toolbar 中扩充自己的菜单项,而不涉及 Activity。

【讨论】:

  • 一旦您引用了工具栏,您就可以调用 Toolbar.inflateMenu()。例如在 onViewCreated()
  • 完美答案! :)
【解决方案2】:

无效方法(){ int currentItemIndex = mNewsItemList.indexOf(newsItem);

    mArticleSwipeMap = new HashMap<>();
    mPagerAdapter = new ArticlePagerAdapter(getSupportFragmentManager());
    mPagerAdapter.swapList(mNewsItemList);
    mViewPager.setOnSwipeOutListener(this);
    mViewPager.setAdapter(mPagerAdapter);
    mViewPager.setCurrentItem(currentItemIndex);
    mViewPager.addOnPageChangeListener(this);

} 前 调用 onresume 您的片段。 再见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多