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目录设置
通过代码创建:
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方法中:
然后给viewpager设置一个滑动监听:
按如上的操作就完成了同一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的需求。
相关文章推荐
- 读书笔记--Android数据存储与文件IO
- android之获取屏幕宽度、控件宽度
- android中layout属性介绍
- Android IntentService
- android初接触之service2
- android wearable-Creating a 2D Picker,Showing Confirmations and Exiting Full-Screen Activities
- 【常用工具类】ToastUtil
- Android自助餐之动画(二)属性动画
- Android自助餐之动画(二)补间动画
- Android自助餐之动画(一)帧动画
- Android SQLLite 的基础操作
- android wearable-Creating Cards and Creating Lists
- Android之TextView
- android wearable-Creating Custom Layouts
- android初接触之service1
- android 获取apk md5值
- Android studio ElasticDownloadView
- Android:30分钟弄明白Touch事件分发机制(转)
- Android应用坐标系统全面详解
- Android mk文件详解