当前位置:  开发笔记 > 编程语言 > 正文

Viewpager与不同的菜单和常用工具栏无法正常工作

如何解决《Viewpager与不同的菜单和常用工具栏无法正常工作》经验,为你挑选了1个好方法。

我的应用程序中有标签.每个标签都有不同的片段,并有不同的菜单.下面是我正在使用的布局

    


    

        

            


        

        

        

    

    

        

        

    

现在,onCreate()我已经提到了每一个片段setHasOptionsMenu(true);.我已经覆盖了onCreateOptionsMenu()每个片段中的函数,它menu.clear();首先调用它的超级构造函数然后膨胀片段自己的菜单xml.但我得到的结果是这样的 -

假设有5个选项卡.第二个和第三个选项卡中的viewpager每个包含两个以内的片段

第一个标签没有菜单

第二个选项卡有menu_2(仅适用于第二个子片段)

第三个标签再次没有菜单

第4个选项卡有menu_4(仅适用于第1个子片段)

第五个标签有menu_5

最初,选项卡1应该没有菜单,这是好的.然后直接移动到第三个选项卡,它显示menu_4,默认情况下不显示菜单.然后滑动到选项卡4,它将显示正确的menu_4然后滑回第3个选项卡,它将显示没有菜单(这是必需的).

对于选项卡5也会发生同样的情况.如果我在第二个选项卡中切换到第二个子片段,则第一个选项卡会出现相同的行为.

简而言之,根据我的观察,它显示了相邻标签的菜单,它实际上是在当前片段之后执行的,因此正在发生这种行为.

那么如何避免这种情况呢?



1> Konstantin L..:

我写了一个小测试应用程序来检查行为.

在此输入图像描述

让我们看看样本,看看你的片段是否有问题(如上所示,ViewPager与不同的菜单就像魅力一样)

Activity的XML:




    

    

Activity类.重要的是invalidateOptionsMenu()每次ViewPager都有PageSelected事件.然后,我们设置setHasOptionsMenu所有片段和子片段(从嵌套ViewPagers)到false屏幕外.

public class MainActivity extends AppCompatActivity {

    PagerAdapter pagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Fragment[] fragments = {
                Fragment.instantiate(this, FragmentNoMenu.class.getName()),
                Fragment.instantiate(this, FragmentA.class.getName()),
                Fragment.instantiate(this, FragmentNoMenu.class.getName()),
                Fragment.instantiate(this, FragmentB.class.getName()),
        };

        TabLayout tabLayout = (TabLayout)findViewById(R.id.tabLayout);
        ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager);
        pagerAdapter = new PagerAdapter(getSupportFragmentManager(), fragments);
        viewPager.setAdapter(pagerAdapter);
        viewPager.setOffscreenPageLimit(0);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
            @Override
            public void onPageSelected(int position) {
                invalidateOptionsMenu(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {}
        });

        invalidateOptionsMenu(0);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void invalidateOptionsMenu(int position) {
        for(int i = 0; i < pagerAdapter.getCount(); i++) {
            Fragment fragment = pagerAdapter.getItem(i);
            fragment.setHasOptionsMenu(i == position);

            if (fragment instanceof FragmentWithViewPager) {
                FragmentWithViewPager fragmentWithViewPager = (FragmentWithViewPager)fragment;
                if (fragmentWithViewPager.pagerAdapter != null) {
                    for (int j = 0; j < fragmentWithViewPager.pagerAdapter.getCount(); j++) {
                        fragmentWithViewPager.pagerAdapter.getItem(j).setHasOptionsMenu(i == position);
                    }
                }
            }
        }

        invalidateOptionsMenu();
    }
}

PagerAdapter 类:

public class PagerAdapter extends FragmentPagerAdapter {

    private final Fragment[] fragments;

    public PagerAdapter(FragmentManager fragmentManager, Fragment[] fragments) {
        super(fragmentManager);
        this.fragments = fragments;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragments[position].getClass().getSimpleName();
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

    @Override
    public int getCount() {
        return fragments.length;
    }
}

这是我使用的测试片段:

FragmentNoMenu 类:

public class FragmentNoMenu extends android.support.v4.app.Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_no_menu, container, false);
    }
}

FragmentNoMenu 布局:



FragmentA class是具有嵌套ViewPager的片段:

public class FragmentA extends FragmentWithViewPager {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_a, container, false);

        Fragment[] fragments = {
                Fragment.instantiate(getContext(), SubFragmentA.class.getName()),
                Fragment.instantiate(getContext(), SubFragmentB.class.getName()),
                Fragment.instantiate(getContext(), SubFragmentC.class.getName()),
        };

        if (pagerAdapter == null) {
            pagerAdapter = new PagerAdapter(getChildFragmentManager(), fragments);
        }

        viewPager = (ViewPager)rootView.findViewById(R.id.viewPager);
        viewPager.setAdapter(pagerAdapter);
        return rootView;
    }

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

FragmentA的布局:



    

FragmentA的菜单:



    

    

NB!FragmentAextends FragmentWithViewPager- 它是一个小扩展,Fragment可以更容易地将片段与MainActivity中的嵌套片段区分开来:

public class FragmentWithViewPager extends Fragment {
    PagerAdapter pagerAdapter;
    ViewPager viewPager;
}

FragmentB:

public class FragmentB extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_b, container, false);
    }

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

它的布局和菜单:




.....



    

子片段(从代码角度看它们看起来都一样):

布局:




    


码:

public class SubFragmentB extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.subfragment_b, container, false);
    }
}

而已!我已将项目上传到我的Dropbox - 随时查看!

我希望,这有帮助

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有