目录(?)[-]

  1. 利用XML创建菜单
    1. XML的有关属性
    2. onClick事件
  2. Pop-up菜单

利用XML创建菜单

在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进行设置。在之前的Pro Android学习笔记(十):了解Intent(上)#系统的Intent中我们已经给了一个如何利用XML进行菜单项设计的详细小例子,这里就不在重复。这里仅补充一下说明。

XML的有关属性

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This group uses the default category. --> 
    <group android:id="@+id/menuGroup_Main"> 
        <item android:id="@+id/menu_testPick" 
            android:orderInCategory="5" 
            android:icon="@draw/ic_leaf" 
            android:title
="Test Pick" /> 
        <item .../> 
        <item .../>  
   <!--  下面是子菜单的例子:采用menu嵌套的方式实现 –>
        <item android:id="@+id/file"  android:title="@string/file" >  
            <menu> 
                 <item ...... /> 
                 <item ...... /> 
           </menu> 
       </item>
  
    </group> 
</menu>

相关的可以阅读reference中的API Guide。(sdk/docs/guide/topics/ui/menus.html#xml)。除了上面例子给出的属性外,部分常用的属性如下:

如果我们要制定menu的category,这可通过以下的方式:

<group android:id="@+id/some_group_id " android:menuCategory="secondary">

可以设置checkable属性,例子如下:

<?xml version="1.0" encoding="utf-8"?> 
<menu …… > 
    <group android:id="@+id/menuGroup_popup" android:checkableBehavior="all">
        <item android:id="@+id/pop_menu_1" android:checked="true" android:title="popup.item.1" />
        <item android:id="@+id/pop_menu_2" android:title="popup.item.2" /> 
    </group> 
</menu>

下图是在一个pop-up菜单上采用采用这个menu xml构造的样式:

此外还可以设置enable,visible,shortcut等属性,如下:

<item android:id="… " android:enabled="true" … /> 
<item android:id="… " android:alphabeticShortcut="a" … /> 
<item android:id="... " android:visible="true"  ... />

onClick事件

在之前学习中,我们知道menu item支持click listener,因此我们可以直接在item中设置onClick事件的回调函数,如下:

<item …… android:onClick="onClick_callback_method_name" />

Pop-up菜单

当view收到某种事件,例如点击,可以触发弹出菜单(PopupMenu)。下面是小例子的代码:

public class PopupMenuTest extends Activity{ 
    private TextView infoTv = null;

@Override 
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.popup_layout); 
        infoTv = (TextView)findViewById(R.id.pop_pureInfo);  
        showInfo("点击这个Textview,将演示Pop-up Menu.");  
       //点击textView时,弹出popupMenu  
        infoTv.setOnClickListener(new OnClickListener() {     
            @Override 
            public void onClick(View v) { 
                showPopupMenu();                
            } 
        }); 
    } 
    
    private void showPopupMenu(){ 
        PopupMenu popMenu = new PopupMenu(this,infoTv); 
        popMenu.inflate(R.menu.my_popup); 
        //popMenu.getMenuInflater().inflate(R.menu.my_popup, popMenu.getMenu());  //Android 4.0之前的处理
        popMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {             
            //不能通过Activity的onOptionsItemSelected()来实现Popup菜单项的触发,而是通过click listener的方式。
            public boolean onMenuItemClick(MenuItem item) {  
                showInfo("Item clicked : " + item.toString());
                return false; 
            } 
        }); 
        showInfo(popMenu.toString());
        popMenu.show(); 
    } 
    
    private void showInfo(String info){ 
        infoTv.append(info + "\n"); 
        Log.d(getLocalClassName(),info); 
    } 
}

最初,运行的效果如上左图,popup菜单挤在最上面,根本看不全。而我们期待的是右图的方式。这是因为某view的popup菜单在某view的外面显示,即不会遮挡某view。一开始,我们将textview设置为全屏模式,没有预留空余位置显示,所以成了左图那样,效果很不理想。后来我们将textView的layout_height改为wrap_content,就得到了期待的菜单方式。

如果view所占的空间很大,而菜单的内容有比较多,可以考虑使用contextMenu。

本博文涉及的例子代码,可以在Pro Android学习:Menu中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单的更多相关文章

  1. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

  2. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu

    目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...

  3. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  4. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  5. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  6. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  7. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  8. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  9. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

随机推荐

  1. [luogu4315]月下“毛景树”

    [luogu4315]月下"毛景树" luogu 联赛前复习一发树剖.不会告诉你WA了4发 #define ls x<<1,l,mid #define rs x< ...

  2. centos7安装 go

    1    下载 - Golang中国 2:解压 tar -xzf go1.0.3.linux-amd64.tar.gz 3:环境 变量 : 把 /usr/local/go/bin 增加到 PATH 环 ...

  3. mysql 自连接查询数据

    今天项目BOSS提了个sql语句需求,我听得稀里糊涂,没办法,一步步讨论.实践,最终搞定. 先上建表语句: /* Navicat MySQL Data Transfer Source Server : ...

  4. Oracle分页总汇

    Oracle分页总汇 select * from (select a.*,rownum row_num from (select * from mytable t order by t.id desc ...

  5. php关于<<<的用法

    Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术.但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实 ...

  6. 10款CSS3进度条Loading动画

    在线演示 本地下载

  7. JavaScriptr -- 常用对象 String, date, prototype

    <script type="text/javascript"> //给已有的对象添加自定义功能 function getMax() { var max = this[0 ...

  8. Android_微信_设置

    减少 内存的使用 (http://news.ifeng.com/a/20170716/51440541_0.shtml) 1.关闭“附近的人” 打开微信,依次点击[我]—[设置]—[通用]—[功能], ...

  9. java:安装Runtime Environment,设置Tomcat Server 的方法

    Eclipse 中开发Webapp, 一般需要配置Tomcat Server, 以便在Eclipse 中进行Debug.具体的步骤如下: 1. Windows ==>Preference ==& ...

  10. JS使用模板快速填充HTML控件数据

    function formatTemplate(dta, tmpl) { var format = { name: function(x) { return x ; } }; return tmpl. ...