zoukankan      html  css  js  c++  java
  • Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系

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

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

    在activity中:

    1. @Override
    2. public boolean onCreateOptionsMenu(Menu menu) {
    3.   getMenuInflater().inflate(R.menu.main, menu);
    4.   return super.onCreateOptionsMenu(menu);
    5. }

    在Fragment中:

    1. @Override
    2. public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    3.   inflater.inflate(R.menu.pictrue_list, menu);
    4.   super.onCreateOptionsMenu(menu,inflater);
    5. }

    两者不同的地方在于

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

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

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

    一般我们是在nCreate中调用

    1. @Override
    2. public void onCreate(Bundle savedInstanceState) {
    3.   super.onCreate(savedInstanceState);
    4.   mBucketId = getArguments().getInt(Images.Media.BUCKET_ID);
    5.   mCallback = new ModeCallback();
    6.   setHasOptionsMenu(true);
    7. }

    三、如果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. <menu xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. tools:context="com.example.acctionbaractivitydemo.MainActivity" >
    5. <item
    6. android:id="@+id/take_pic"
    7. android:title=""
    8. android:icon="@drawable/ic_action_camera"
    9. app:showAsAction="withText|ifRoom"/>
    10. <item
    11. android:id="@+id/multi_select"
    12. android:title="@string/multi_select"
    13. app:showAsAction="withText|ifRoom"/>
    14. <item
    15. android:id="@+id/theme_color_pick"
    16. android:orderInCategory="100"
    17. android:title="@string/theme_color_pick"
    18. app:showAsAction="never"/>
    19. </menu>

    fragment中:

    1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. tools:context="com.example.acctionbaractivitydemo.MainActivity" >
    5. <item
    6. android:id="@+id/multi_select"
    7. android:title="@string/multi_select"
    8. app:showAsAction="withText|ifRoom"/>
    9. <item
    10. android:id="@+id/show_in_detail"
    11. android:orderInCategory="100"
    12. android:title="@string/show_in_detail"
    13. app:showAsAction="never"/>
    14. </menu>

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

    这时如果activity中

    1. @Override
    2. public boolean onOptionsItemSelected(MenuItem item) {
    3. switch(item.getItemId()){
    4.   case R.id.take_pic:
    5.   capturePicture();
    6.   break;
    7.   case R.id.multi_select:
    8.   Toast.makeText(MainActivity.this, "ss", 500).show();
    9.   break;
    10. }
    11. return super.onOptionsItemSelected(item);
    12. }

    Fragment中:

    1. @Override
    2. public boolean onOptionsItemSelected(MenuItem item) {
    3. switch(item.getItemId()){
    4.   case R.id.multi_select:
    5.    mGridView.setItemChecked(0,true);
    6.    mGridView.clearChoices();
    7.    mCallback.updateSeletedCount();
    8.   break;
    9.   case R.id.show_in_detail:
    10.   break;
    11. }
    12. return super.onOptionsItemSelected(item);
    13. }

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

  • 相关阅读:
    RDD执行延迟执行原理
    spark应用运行机制解析1
    spark streaming job生成与运行
    spark的Task的序列化
    spark将计算结果写入到hdfs的两种方法
    spark的runJob函数2
    SVG---------SVG sprite 使用示例
    段落边框——paraBox.scss
    背景条纹——bgStripes.scss
    css3动画——基本准则
  • 原文地址:https://www.cnblogs.com/sirius-swu/p/6628025.html
Copyright © 2011-2022 走看看