常州专业做网站/国际新闻头条今日国际大事
最近在开发过程中,遇到了一个再显示不同的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)中加载此布局:
@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; }
通过代码创建:
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方法中:
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//判断当前处于哪个fragmentswitch (viewPagerSelected) {case 0://第一个fragment的menumenu.add(0, ID_EDIT, 0, "编辑");menu.add(0, ID_CANCEL_EDIT, 0, "取消编辑");break;case 1://第二个fragment的menu(无)break;case 2://第三个fragment的menumenu.add(0, ID_CREATE_GROUP, 0, "创建群组");break;}return true;}
然后给viewpager设置一个滑动监听:
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {@Overridepublic void onPageSelected(int position) {//更新当前是哪个fragmentviewPagerSelected = position;//刷新显示的menurefreshMenu();}});//刷新Menuprivate void refreshMenu(){//核心是Activity这个方法supportInvalidateOptionsMenu();}
按如上的操作就完成了同一Activity中不同Fragment设置不同的menu的需求。