Android中MenuInflater实例

我们知道,LayoutInflater是用来实例化整个布局文件,而 MenuInflater是用来实例化Menu目录下的Menu布局文件的。

传统意义上的菜单定义需要Override Activity的onCreateOptionsMenu,然后在里面调用Menu.add把Menu的一个个item加进来,比较复杂。而通过使用MenuInflater可以把Menu的构造直接放在Menu布局文件中,真正实现模型(Model)与视图(View)的分离,程序也看着清爽多了。

下面一个实例是定义四个菜单,并且实现了一个菜单事件, 当我们点击设置(Settind) 菜单,进入手机设置状态。

效果图如下:

 

源代码如下:

/TestMenuInflater/res/menu/options_menu.xml:

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item
  4. android:id="@+id/menu_add"
  5. android:title="Add"
  6. android:icon="@android:drawable/ic_menu_add"/>
  7. <item
  8. android:id="@+id/menu_wallaper"
  9. android:title="Wallpaper"
  10. android:icon="@android:drawable/ic_menu_gallery"/>
  11. <item
  12. android:id="@+id/menu_search"
  13. android:title="Search"
  14. android:icon="@android:drawable/ic_search_category_default"/>
  15. <item
  16. android:id="@+id/menu_setting"
  17. android:title="Settings"
  18. android:icon="@android:drawable/ic_menu_preferences"/>
  19. </menu>

TestMenuInflater.java:

[c-sharp] view plaincopy

  1. package com.android.test;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuInflater;
  7. import android.view.MenuItem;
  8. public class TestMenuInflater extends Activity {
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. }
  14. @Override
  15. public boolean onCreateOptionsMenu(Menu menu) {
  16. MenuInflater inflater = getMenuInflater();
  17. inflater.inflate(R.menu.options_menu, menu);
  18. return true;
  19. }
  20. @Override
  21. public boolean onOptionsItemSelected(MenuItem item) {
  22. switch (item.getItemId()) {
  23. case R.id.menu_add:
  24. break;
  25. case R.id.menu_wallaper:
  26. break;
  27. case R.id.menu_search:
  28. break;
  29. case R.id.menu_setting:
  30. showSettings();
  31. break;
  32. }
  33. return super.onOptionsItemSelected(item);
  34. }
  35. private void showSettings(){
  36. final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
  37. settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
  38. Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
  39. startActivity(settings);
  40. }
  41. }

几点说明:

  1. 与LayoutInflater相比,MenuInflater的用法简单多了。首先,MenuInflater获取方法只有一种:Activity.getMenuInflater();其次,MenuInflater.inflater(int menuRes,Menu menu)(这里不代表inflater就是static方法,可以这样调用,只是为了描述方便)的返回值是void型,这就决定了MenuInflater.inflater后就没有后续操作了。这说明通过这种方式把Menu布局文件写好后就不能在程序中动态修改了,而不像LayoutInflater.inflater那样,返回值是View型,可以进行后续的进一步操作。另外,MenuInflater只有一个void inflater(int menuRes,Menu menu)非构造方法。
  2. Menu布局文件中的icon资源是Android自带的,通过“@android:drawable/"获取到。
  3. 另外,Android也有类似的功能。具体参考源码:/packages/apps/Launcher/src/com/android/launcher/Launcher.java

转载自:http://blog.csdn.net/zhangqijie001/article/details/5836492

时间: 2024-08-19 01:14:13

Android中MenuInflater实例的相关文章

Android中LayoutInflater实例

LayoutInflater与findViewById的用法有很多可比较之处. 如:他们都可以通过id返回View. LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.custom_dialog,null); Button button = (Button) findViewById(R.id.button); 不同之处是:LayoutInflater是用来实例化整个布局文

Android中由IP地址查询经纬度坐标的实例

大家都知道,根据IP地址就可以知道它所在的具体位置,在Android中同样可以由IP地址得到它的位置,即具体的地理经纬度坐标. 本文就直接以代码的方式演示如何根据IP地址查询地理经纬度坐标位置,下面的例子中演示的就是由58.192.32.1这个IP地址查询到其所在的经纬度坐标为(118.777802,32.061699). Java代码 package eoe.demo; import com.mapdigit.gis.DigitalMap; import com.mapdigit.gis.Ma

Android 中Message,MessageQueue,Looper,Handler详解+实例

一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue.其他非主线程,不会自动创建Looper,要需要的时候,通过调 用prepar

Android中的跨进程通信方法实例及特点分析(二):ContentProvider

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问

Android中的跨进程通信方法实例及特点分析(一):AIDL Service

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 最近有一个需求就是往程序中加入大数据的采集点,但是因为我们的Android程序包含两个进程,所以涉及到跨进程通信的问题.现将Android中的跨进程通信方式总结如下. Android中有4种跨进程通信方式,分别是利用AIDL Service.ContentProvider.Broadcast.Activity实现. 1.利用AIDL Service实现跨进程通信 这是

Android中的消息处理实例与分析

Android中的消息处理实例与分析 摘要 本文介绍了Android中的消息处理机制,给出了Android消息处理中的几个重点类Handler.Message.MessageQueue.Looper.Runnable.Thread的详细介绍,提供了两个消息处理的实例代码,并深入分析了使用Android消息机制应该遵循的几个原则. 阅读本文的收获 在具有java基础的情况下,Android的学习比较轻松,很多人在没有深刻了解Android消息处理机制的背景下,已经能够开发出可用的app,很多人开始

android中反射技术使用实例

在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.反射 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.Java 的反射机制的实现要借助于4个类:class,Constructor,Field,

Android中制作自定义dialog对话框的实例

http://www.jb51.net/article/83319.htm 这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继承Dialog类来制作自己的对话框,需要的朋友可以参考下 自定义dialog基础版很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用. 首先创建布局文件d

Android中Handler的使用方法及实例(基础回顾)

Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,不停的运行下去,当单击End按钮时,该线程就会停止,如果继续单击Start,则文字又开始输出了. 软件界面如下: 实验主要部分代码和注释: MainActivity.java: 1 package com.ex