[转]于Fragment和Activity之间onCreateOptionsMenu的问题

Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于Fragment是从属于activity的,因此第一次使用onCreateOptionsMenu的时候需要注意以下知识点。

一、在Activity和Fragment中onCreateOptionsMenu的实现是有细微差别的

在activity中:


1

2

3

4

5

@Override

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    return super.onCreateOptionsMenu(menu);

}

在Fragment中:


1

2

3

4

5

@Override

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

        inflater.inflate(R.menu.pictrue_list, menu);

        super.onCreateOptionsMenu(menu,inflater);

}

两者不同的地方在于

(1)一个有返回值(boolean类型),一个没有返回值。

(2)Fragment中onCreateOptionsMenu的参数多了一个MenuInflater

 

二、想让Fragment中的onCreateOptionsMenu生效必须先调用setHasOptionsMenu方法

一般我们是在nCreate中调用


1

2

3

4

5

6

7

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mBucketId = getArguments().getInt(Images.Media.BUCKET_ID);

    mCallback = new ModeCallback();

    setHasOptionsMenu(true);

}

三、如果Fragment和Activity都同时inflate了一个menu资源文件,那么menu资源所包含的菜单会出现两次

为什么呢,因为inflater.inflate(R.menu.pictrue_list, menu)方法的作用其实就是将第一个参数中包括的菜单项追加到menu中。一开始,在activity中menu是空的,当调用了getMenuInflater().inflate(R.menu.main, menu)

menu中便有了菜单项,而在执行到Fragment的(Menu menu, MenuInflater inflater)时,activity的menu就传递下来,作为第一个参数。activity和Fragment中的menu其实是一个对象。

我还可以从上面的分析中得出,Fragment的菜单项会显示在Activity菜单项的后面。

 

为了解决menu资源所包含的菜单会出现两次这个问题,一般我们让Activity和Fragment  inflate两个不同的菜单(就如上面的例子),Fragment会继承Activity的所有菜单。

 

四、如果在Fragment和Activity中有相同的菜单元素,并且activity和fragment都对此菜单有响应的话,那么将执行两次响应事件。

除此之外,该菜单元素会显示两次。

举例说明:

activity中的菜单资源:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<menu xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    tools:context="com.example.acctionbaractivitydemo.MainActivity" >

    <item

        android:id="@+id/take_pic"

        android:title=""

        android:icon="@drawable/ic_action_camera"

        app:showAsAction="withText|ifRoom"/>

    <item

        android:id="@+id/multi_select"

        android:title="@string/multi_select"

        app:showAsAction="withText|ifRoom"/>

    <item

        android:id="@+id/theme_color_pick"

        android:orderInCategory="100"

        android:title="@string/theme_color_pick"

        app:showAsAction="never"/>             

</menu>

fragment中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<menu xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    tools:context="com.example.acctionbaractivitydemo.MainActivity" >

    <item

        android:id="@+id/multi_select"

        android:title="@string/multi_select"

        app:showAsAction="withText|ifRoom"/>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    <item

        android:id="@+id/show_in_detail"

        android:orderInCategory="100"

        android:title="@string/show_in_detail"

        app:showAsAction="never"/>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

</menu>

他们有相同的菜单multi_select(主要是id相同)。

这时如果activity中


1

2

3

4

5

6

7

8

9

10

11

12

13

@Override

public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()){      

        case  R.id.take_pic:

            capturePicture();

            break;         

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

        case  R.id.multi_select:

            Toast.makeText(MainActivity.this, "ss", 500).show();

            break;     

    }

    return super.onOptionsItemSelected(item);

}

Fragment中:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Override

public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()){  

    case  R.id.multi_select:

        mGridView.setItemChecked(0,true);

        mGridView.clearChoices();

        mCallback.updateSeletedCount();

        break

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

    case  R.id.show_in_detail:

        break;         

    }

    return super.onOptionsItemSelected(item);

}

那么两者的case R.id.multi_select代码块都会执行。

时间: 2024-10-21 17:21:01

[转]于Fragment和Activity之间onCreateOptionsMenu的问题的相关文章

Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系

Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于Fragment是从属于activity的,因此第一次使用onCreateOptionsMenu的时候需要注意以下知识点. 一.在Activity和Fragment中onCreateOptionsMenu的实现是有细微差别的: 在activity中: @Override public boolean

Android中Fragment和Activity之间的互操作代码例子

摘要 本文介绍了Android中一个Activity中有多个Fragment的情况下,Fragment之间如何通过Activity进行互操作. 源代码 源代码地址为:http://download.csdn.net/detail/logicteamleader/8931199 源代码使用ADT编写,ADT版本为2014,Android版本为android-22. 技术要点 1.在Activity中的多个Fragment之间要互操作,一定要通过此Activity,不能直接通信: 2.在Activi

安卓Fragment和Activity之间的数据通讯

Fragment是Android3.0之后才推出来的.可以用来做底部菜单,现在很多APP都有用到这个底部菜单.当然TabHost也可以用来做底部菜单,但是Fragment来做,动画效果这些可以做得更炫. Fragment和Activity之间是可以相互进行参数传送这些.但是Fragment不可以直接就将数据传送到另外一个Fragment,而是借助Activity,先传到Activity,如何再通过Activity传到Fragment.  所以实现Fragment和Activity之间的数据传送是

Android——Fragment和Activity之间的通信+Frangment生命周期

Android--Fragment和Activity之间的通信+Frangment生命周期 Fr'agment和Activity之间的通信 1.在Fragment中声明一个接口. 2.在Activity中实现在Fargment中声明的接口. 3.在Fragment中声明一个接口对象. 4.在Frangment的生命周期Onattach方法中判断当前Activity是否实现了此Fragment中声明的接口.如果已实现,就把当前Activity转换成接口对象. 5.调用Activity中实现的方法=

android中fragment和activity之间相互通信

在用到fragment的时候,老是会遇到一个问题,就是fragment与activity之间的通信.下面就来记录一下activity和fragment之间 通过实现接口来互相通信的方法. 1. activity 向fragment发出通信,就这么写: private OnMainListener mainListener; // 绑定接口 @Override public void onAttachFragment(Fragmentfragment) { try { mainListener =

Android实战简易教程-第五十二枪(Fragment和Activity之间通信)

Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Activity->Fragment传递数据 1.main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an

Android 笔记-Fragment 与 Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

Android笔记Fragment与Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

fragment与activity之间的利用接口通信

在用到fragment的时候,老是会遇到一个问题,就是fragment与activity之间的通信.下面就来记录一下activity和fragment之间 通过实现接口来互相通信的方法. 1. activity 向fragment发出通信,就这么写: private OnMainListener mainListener; // 绑定接口 @Override public void onAttachFragment(Fragmentfragment) { try { mainListener =