您的位置:首页 > 移动开发 > Android开发

Android同一Activity中不同Fragment设置不同的menu(ViewPager+Fragment)

2016-01-14 21:51 483 查看
最近在开发过程中,遇到了一个再显示不同的Fragment时给予其不同的menu显示,由于这几个Fragment属于同一个Activity而menu是对Activity设置的对于Fragment并没有设置menu的方法,再查了很多资料之后终于解决了这个问题。

开发的背景:

MainActivity使用一个viewPager,给这个viewPager设置一个FragmentPagerAdapter而给其设置了多个Fragment。现在的需求是在ViewPager切换不同的Fragment时显示不同的Menu,而设置Menu的方法onCreateOptionsMenu与onPrepareOptionsMenu以及onOptionsItemSelected仅在MainActivity中存在。

在解释解决方法之前,向简单回顾Android中的Menu简单用法:

1) menu的创建:

通过资源文件res/menu目录设置
<item>
来完成设置,在方法onCreateOptionsMenu(Menu menu)中加载此布局:

[code]@Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.activity_main, menu);  
        return true;  
    }


通过代码创建:

[code]public boolean onCreateOptionsMenu(Menu menu) {  
//第三个参数表示此menu的id值,在onOptionsItemSelected方法中通过id值判断是哪个menu被点击了
 menu.add(Menu.NONE, 1, 1, "菜单1");  
 menu.add(Menu.NONE, 2, Menu.NONE, "菜单2");  
 return true;  
}


2)menu的创建过程:

menu的创建过程包括三个方法:

onCreateOptionsMenu与onPrepareOptionsMenu以及onOptionsItemSelected

其中:

onCreateOptionsMenu:

只会调用一次,他只会在Menu显示之前去调用一次,之后就不会在去调用。

onPrepareOptionsMenu:

onPrepareOptionsMenu是每次在display Menu之前,都会去调用,只要按一次Menu按鍵,就会调用一次。所以可以在这里动态的改变menu。一般使用这个函数时先执行menu.clear().否则如果在这里执行add()的话会不停的追加。

3)menu的点击处理:

onOptionsItemSelected :

响应menu的点击操作,它的参数MenuItem item可以通过getItemId方法获取是哪个menu被点击了从而响应不同的操作。

现在看上面问题的解决方法:

在MainActivity中设置一个全局变量来保持当前是那一个fragment,当然默认值为0表示第一个。在创建onCreateOptionsMenu方法中:

[code]   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //判断当前处于哪个fragment
        switch (viewPagerSelected) {
            case 0:
                //第一个fragment的menu
                menu.add(0, ID_EDIT, 0, "编辑");
                menu.add(0, ID_CANCEL_EDIT, 0, "取消编辑");
                break;
            case 1:
                //第二个fragment的menu(无)
                break;
            case 2:
                //第三个fragment的menu
                menu.add(0, ID_CREATE_GROUP, 0, "创建群组");
                break;
        }
        return true;
    }


然后给viewpager设置一个滑动监听:

[code] viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
            //更新当前是哪个fragment
                viewPagerSelected = position;
                //刷新显示的menu
                refreshMenu();
            }
        });
        //刷新Menu
    private  void  refreshMenu(){
          //核心是Activity这个方法
        supportInvalidateOptionsMenu();
    }


按如上的操作就完成了同一Activity中不同Fragment设置不同的menu的需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: