Android编程基础之Menu功能菜单设计实例

正文实例陈诉了Android编制程序中的Menu功用菜单。分享给大家供大家参谋,具体如下:

【声明】

Android效用菜单的构思,程序里定义了多少个菜单子项,一个是”关于”,贰个是”退出”,当点击”关于”时候,新建二个Toast
提醒,当点击”退出”时,大家将终结程序.

应接转发,但请保留随笔原本出处→_→

程序里除了暗中认可覆盖的onCreate
外之外,还亟需别的新建三个类函数:onCreateOptionsmenu
()与onOptionsItemSelected (),前者为创制Menu
菜单的门类,前者则是拍卖菜单被增选运转后的平地风波管理.

生命壹号:

看一下功力图:

文章来源:

图片 1

 

我们只在多个文书里作了变动,也正是Menu德姆o.Java ,代码如下:

【正文】

package com.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MenuDemo extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }
 // 创建菜单
 public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, 0, 0, "关于");
  menu.add(0, 1, 1, "退出");
  return super.onCreateOptionsMenu(menu);
 }
 //菜单响应
 public boolean onOptionsItemSelected(MenuItem item) {
  super.onOptionsItemSelected(item);
  switch (item.getItemId()) {
  case 0:
   Toast.makeText(MenuDemo.this, "欢迎来到脚本之家", Toast.LENGTH_LONG).show();
  case 1:
   this.finish();
  }
  return true;
 }
}

从官方文书档案理解到,从Android3.0(API level
11卡塔尔国早先,Android设备不再供给提供贰个专程的美食指南开关,转而引入应用ActionBar。所以现在市道上相当多新装置使用四个虚构按钮,并不再额外提供菜单按键。

更加多关于Android相关内容感兴趣的读者可查看本站专项论题:《Android开采入门与晋级教程》、《Android视图View技艺总括》、《Android编制程序之activity操作技术计算》、《Android操作SQLite数据库才干计算》、《Android操作json格式数据本事总计》、《Android数据库操作技能总括》、《Android文件操作本领汇总》、《Android编制程序开辟之SDXC存款和储蓄卡操作方法汇总》、《Android财富操作技艺汇总》及《Android控件用法总括》

因为Android版本的迈入,对于菜单的扶助各样版本有超级大的区分,而Android3.0是个分界线,大约能够分为下边三类:

盼望本文所述对大家Android程序设计有着协助。

  • OptionMenu和ActionBar:一些操作的聚众,如若开辟的平台在Android3.0之上,推荐使用ActionBar,假若开辟的阳台在Android2.3或之下,依然得以行使OptionMenu的。
  • ContextMenu和ActionMode:ContextMenu是一个变迁的窗口格局展现一个抉择列表,ActionMode是二个出示在显示屏顶上部分的操作栏,允许客户选择多少个选项,ActionMode在Android3.0自此才有扶植。
  • Popup
    Menu:PopupMenu是牢固在View上的模态菜单,以弹出的点子突显,在Android3.0后头才有支持。

您也许感兴趣的篇章:

  • Android
    开源项目侧面栏菜单(SlidingMenu)使用详细解释
  • 读书领会Android菜单Menu操作
  • 详解Android中的Menu菜单键
  • Android开发之menu菜单
  • Android仿Wechat菜单(Menu)(使用C#和Java分别完结卡塔尔国
  • Android开源组件SlidingMenu侧滑菜单使用介绍
  • Android创制Menu菜单实例
  • Android动态加多menu菜单的简短方法
  • Android 2.3.7.r1
    camera摄像进程中按menu菜单键时会甘休拍录
  • 在Android中开创菜单项Menu以致获得手提式有线电话机分辨率的消除情势
  • 用Android
    MenuInflater成立菜单项的法子步骤

【在XML中定义三个美食做法】

Android提供了专门的学问的XML格式的财富文件来定菊花菜单项,而且对具有菜单体系都帮忙,推荐应用XML财富文件来定菊花菜单,之后再把它Inflater到Activity也许Fragment中,实际不是在Activity中央银行使代码申明。

而菜单的XML财富文件,需求创制在/res/menu/目录下,何况包涵一下多少个成分:

  • <menu>:定义二个Menu,是三个美食指南能源文件的根节点,里面能够包涵一个要么八个<item>和<group>成分。
  • <item>:成立二个MenuItem,代表了菜单中二个增选。
  • <group>:对菜单项进行分组,能够以组的款型操作菜单项。

<item>成分除了正规的id、icon、title属性的支撑,还应该有叁个重中之重的性质:android:showAsAction,那性格格是起兼容性的,描述了在Android的高版本中,菜单项哪一天以何种措施步向到ActionBar中。

<group>是对菜单进行分组,分组后的美食做法突显效果并不曾分别,唯生龙活虎的差别在于能够针对菜单组举办操作,那样对于分类的菜单项,操作起来更利于,提供如下的操作:

  • Menu.setGroupCheckable():菜单组内的菜谱是或不是都可选。
  • Menu.setGroupVisible():是或不是掩绿叶甘蓝单组的享有菜单。
  • Menu.setGroupEnabled():菜单组的菜系是或不是有用。

即使菜单项需求单选也许多选,能够运用android:checkableBehavior属性设置,它能够对单个<item>或然<group>设置贰个组,这么些天性选用五个参数:single,单选;all,多选,none,未有Checked的选项,暗中同意。

当制造好一个XML菜单财富文件从今未来,能够行使MenuInflater.inflate()方法填充菜单财富,使XML财富产生一个可编制程序的靶子。

 

风流倜傥、Options menu选项菜单:

OptionMenu,选项菜单,单鼓掌机上的菜单键(MENU)现身,必得配备拥有菜单开关才足以接触。因为荧屏的限量,最五只能突显三个菜单项,即使定义的菜单项超过了八个,别的的菜单项将被隐形,第两个菜单将会来得“更多”,点击展开越来越多的菜系。虽说在Android3.0今后不再推荐使用接纳菜单,不过倘诺运用了,在Android3.0之后的配备上,选项菜单项将被默许转移到ActionBar中,这些能够因而android:showAsAction属性调整。

创制选项菜单的骨干步骤:

(1卡塔 尔(英语:State of Qatar)重写Activity的onCreateOptionMenu(Menu
menu)方法,当菜单第二遍被加载时调用

(2卡塔 尔(阿拉伯语:قطر‎调用Menu 的add(
)方法增多菜单项(MenuItem),同不时间可以调用MenuItem的setIcon()方法为菜单项设置Logo(注:Android
3.0事后,即便增加了Logo也不会来得卡塔尔国

(3卡塔尔国重写Activity的OptionsItemSelected(MenuItem
item)来响应菜单项(MenuItem)的点击事件

来看一下具体的代码达成:

新建Android工程MenuTest:

【情势生龙活虎】通过陈设文件加多Menu选项

(1卡塔 尔(阿拉伯语:قطر‎在res/menu/main.xml中定蒿菜单项。main.xml的代码如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest.MainActivity" >

    <item
        android:id="@+id/start"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/start"/>

        <item
        android:id="@+id/over"
        android:orderInCategory="200"
        android:showAsAction="never"
        android:title="@string/over"/>

</menu>

注:第9行和第15行的字符串援用,要求超前在strings.xml文件中装置好。

(2)MainActivity.java:

 1 package com.example.menutest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Menu;
 6 import android.view.MenuItem;
 7 import android.widget.Toast;
 8 
 9 
10 public class MainActivity extends Activity {
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16     }
17 
18 
19     //重写onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
20     @Override
21     public boolean onCreateOptionsMenu(Menu menu) {
22         // Inflate the menu; this adds items to the action bar if it is present.
23         //填充选项菜单(读取XML文件、解析、加载到Menu组件上)
24         getMenuInflater().inflate(R.menu.main, menu);
25         return true;
26     }
27 
28     //重写OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件(根据id来区分是哪个item)
29     @Override
30     public boolean onOptionsItemSelected(MenuItem item) {
31         // Handle action bar item clicks here. The action bar will
32         // automatically handle clicks on the Home/Up button, so long
33         // as you specify a parent activity in AndroidManifest.xml.
34         switch (item.getItemId()) {
35         case R.id.start:
36             Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
37             break;
38         case R.id.over:
39             Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
40             break;
41 
42         default:
43             break;
44         }
45         return super.onOptionsItemSelected(item);
46     }
47 }

核心代码是第24行:援引布局文件menu.xml,然后在30行的措施中增添MenuItem的点击事件。

运作程序,效果如下:

图片 2图片 3

譬如想让MenuItem变成ActionBar的花样,能够校勘res/menu/main.xml中的android:showAsAction特性,它的属性值风流浪漫共有上边三种:

图片 4

其间,ifRoom表示:要是有空中,就突显出来。withText代表:只显示文本(要是配了Logo的话卡塔尔。假若将品质设置为always,效果如下:

图片 5

假若供给增加子菜单,能够修改menu.xml文件为如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest.MainActivity" >

    <item
        android:id="@+id/start"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/start"/>
    <item
        android:id="@+id/over"
        android:orderInCategory="200"
        android:showAsAction="never"
        android:title="@string/over"/>

    <!-- 子菜单 -->
    <item
        android:id="@+id/setting"
        android:title="setting">
        <menu>
            <item
                android:id="@+id/setting1"
                android:orderInCategory="300"
                android:showAsAction="never"
                android:title="声音設置"/>
            <item
                android:id="@+id/setting2"
                android:orderInCategory="400"
                android:showAsAction="never"
                android:title="背景設置"/>
        </menu>
    </item>

</menu>

于是乎,子菜单的点击事件为:

    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
        case R.id.start:
            Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
            break;
        case R.id.over:
            Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
            break;

        case R.id.setting1:
            Toast.makeText(this, "声音設置", Toast.LENGTH_SHORT).show();
            break;

        case R.id.setting2:
            Toast.makeText(this, "背景設置", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

运行效果如下:

图片 6

 

【方式二】通过Java代码增多Menu选项:

自然了,上方的艺术一是透过xml文件来增加Menu选项的,上边我们因而Java代码来增加Menu选项(那个时候曾经不须要menu.xml文件了)。校正MainActivity.java,代码如下: 

MainActivity.java:

 1 package com.example.menutest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Menu;
 6 import android.view.MenuItem;
 7 import android.view.SubMenu;
 8 import android.widget.Toast;
 9 
10 
11 public class MainActivity extends Activity {
12 
13     
14     private static final int START_ITEM = Menu.FIRST;  //Menu.FIRST的值就是1
15     private static final int OVER_ITEM = Menu.FIRST+1;
16     private static final int SET_ITEM1 = Menu.FIRST+2;
17     private static final int SET_ITEM2 = Menu.FIRST+3;
18     
19     
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24     }
25 
26 
27     //重写onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
28     @Override
29     public boolean onCreateOptionsMenu(Menu menu) {
30         // Inflate the menu; this adds items to the action bar if it is present.
31         //填充选项菜单(读取XML文件、解析、加载到Menu组件上)
32        // getMenuInflater().inflate(R.menu.main, menu);
33         
34         //通过代码的方式来添加Menu
35         //添加菜单项(组ID,菜单项ID,排序,标题)
36         menu.add(0, START_ITEM, 100, "Start");
37         menu.add(0, OVER_ITEM, 200, "Over");
38         //添加子菜单
39         SubMenu sub1 = menu.addSubMenu("setting");
40         sub1.add(1, SET_ITEM1, 300, "声音设置");
41         sub1.add(1, SET_ITEM2, 400, "背景设置");
42         
43         return true;
44     }
45 
46     //重写OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件(根据id来区分是哪个item)
47     @Override
48     public boolean onOptionsItemSelected(MenuItem item) {
49         // Handle action bar item clicks here. The action bar will
50         // automatically handle clicks on the Home/Up button, so long
51         // as you specify a parent activity in AndroidManifest.xml.
52         switch (item.getItemId()) {
53         case START_ITEM:
54             Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
55             break;
56         case OVER_ITEM:
57             Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
58             break;
59             
60         case SET_ITEM1:
61             Toast.makeText(this, "声音設置", Toast.LENGTH_SHORT).show();
62             break;
63             
64         case SET_ITEM2:
65             Toast.makeText(this, "背景設置", Toast.LENGTH_SHORT).show();
66             break;
67 
68         default:
69             break;
70         }
71         return super.onOptionsItemSelected(item);
72     }
73 }

细心第35行对大器晚成生龙活虎参数的演说。

运路程序,效果和下面gif图的功能是毫无二致的。

小结:推荐用艺术1来做。

 

二、Context menu:上下文菜单

看名就能够知道意思 与上下文(碰着)有关。操作时内需长日子按住有些item不放,就能够弹出Context
menu
。效果如下:

图片 7

创建上下文菜单的大旨步骤:

(1卡塔 尔(英语:State of Qatar)覆盖Activity的onCreateContextMenu(Menu
menu)方法,调用Menu的add()方法添加菜单项(MenuItem)

(2卡塔 尔(英语:State of Qatar)覆盖Activity的onContextItemSelected(MenuItem iitem)来响应事件

(3卡塔 尔(英语:State of Qatar)调用registerForContextMenu()方法来为视图注册上下文菜单。

明天透过代码来促成。

双重建多少个Android工程MenuTest02,步骤如下:

咱俩今日activity_main.xml中增添八个开关button1,代码就不写了。然后继续:

(1卡塔尔国在res/menu/main.xml中定同蒿单项。main.xml的代码如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest02.MainActivity" >

    <item
        android:id="@+id/start"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/start"/>
    <item
        android:id="@+id/over"
        android:orderInCategory="200"
        android:showAsAction="never"
        android:title="@string/over"/>

</menu>

(2)MainActivity.java:

 1 package com.example.menutest02;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.ContextMenu;
 6 import android.view.MenuItem;
 7 import android.view.View;
 8 import android.view.ContextMenu.ContextMenuInfo;
 9 import android.widget.Button;
10 import android.widget.Toast;
11 
12 
13 public class MainActivity extends Activity   {
14 
15     private Button button1;
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         button1 = (Button)findViewById(R.id.button1);
21         //为按钮绑定上下文菜单(注意不是绑定监听器)
22         registerForContextMenu(button1);
23     }
24     
25     //创建上下文菜单
26     @Override
27     public void onCreateContextMenu(ContextMenu menu, View v,
28             ContextMenuInfo menuInfo) {
29         super.onCreateContextMenu(menu, v, menuInfo);
30         
31         getMenuInflater().inflate(R.menu.main, menu);
32     }
33     
34     //上下文菜单的触发事件
35     @Override
36     public boolean onContextItemSelected(MenuItem item) {
37         switch (item.getItemId()) {
38         case R.id.start:
39             Toast.makeText(this, "开始···", Toast.LENGTH_SHORT).show();
40             break;
41             
42         case R.id.over:
43             Toast.makeText(this, "结束···", Toast.LENGTH_SHORT).show();
44             break;
45 
46         default:
47             break;
48         }        
49         
50         return super.onContextItemSelected(item);
51     }
52 
53 }

核心代码是第22行:为按键button1绑定上下文菜单。注意不是绑定监听器哦,不要生机勃勃见到按键就绑定监听器哈。

注:五个分界面中只好有八个上下文菜单。

运营程序,长按button,效果如下:

图片 8

注:假如是在java代码中增多Menu,用参数menu来天增添就能够了。

 

三、Popup menu:弹出式菜单

 PopupMenu,弹出菜单,贰个模态情势显得的弹出风格的美食指南,绑在在有个别View上,平日出以后被绑定的View的金迷纸醉(若是下方有空中卡塔 尔(英语:State of Qatar)。

专心:弹出美食做法是在API 11和更高版本上才有效的。

主导步骤:

(1卡塔尔通过PopupMenu的构造函数实例化一个PopupMenu对象,须要传递一个脚下上下文对象乃至绑定的View。

(2卡塔 尔(英语:State of Qatar)调用PopupMenu.setOnMenuItemClickListener()设置三个PopupMenu选项的入选事件。

(3卡塔尔使用MenuInflater.inflate()方法加载二个XML文件到PopupMenu.getMenu()中。

(4卡塔 尔(阿拉伯语:قطر‎在必要的时候调用PopupMenu.show()方法突显。

前天经过代码来贯彻。重新新建多个工程文件MenuTest03。步骤如下:

先在布局文件activity_main.xml中加三个按键,代码略。

(1卡塔 尔(阿拉伯语:قطر‎在res/menu/main.xml中定鹅菜单项。main.xml的代码如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest03.MainActivity" >

    <item
        android:id="@+id/copy"
        android:orderInCategory="100"
        android:title="复制"/>

    <item
        android:id="@+id/delete"
        android:orderInCategory="100"
        android:title="粘贴"/>

</menu>

(2)MainActivity.java:

 1 package com.example.menutest03;
 2 
 3 import android.app.Activity;import android.os.Bundle;
 4 import android.view.MenuInflater;
 5 import android.view.MenuItem;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 import android.widget.PopupMenu;
10 import android.widget.PopupMenu.OnMenuItemClickListener;
11 import android.widget.Toast;
12 
13 
14 public class MainActivity extends Activity implements OnClickListener,OnMenuItemClickListener{
15 
16     
17     private Button button1;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         button1 = (Button)findViewById(R.id.button1);
23         button1.setOnClickListener(this);
24     }
25 
26     //点击按钮后,加载弹出式菜单
27     @Override
28     public void onClick(View v) {
29         //创建弹出式菜单对象(最低版本11)
30         PopupMenu popup = new PopupMenu(this, v);//第二个参数是绑定的那个view
31         //获取菜单填充器
32         MenuInflater inflater = popup.getMenuInflater();
33         //填充菜单
34         inflater.inflate(R.menu.main, popup.getMenu());
35         //绑定菜单项的点击事件
36         popup.setOnMenuItemClickListener(this);
37         popup.show(); //这一行代码不要忘记了
38         
39     }
40 
41     //弹出式菜单的单击事件处理
42     @Override
43     public boolean onMenuItemClick(MenuItem item) {
44         // TODO Auto-generated method stub
45         switch (item.getItemId()) {
46         case R.id.copy:
47             Toast.makeText(this, "复制···", Toast.LENGTH_SHORT).show();
48             break;
49 
50         case R.id.delete:
51             Toast.makeText(this, "删除···", Toast.LENGTH_SHORT).show();
52             break;
53         default:
54             break;
55         }
56         return false;
57     }
58     
59 }

在乎14行代码绑定了多个监听器:OnClickListener和OnMenuItemClickListener。
在绑定OnMenuItemClickListener监听器时,选的是底下这些:

图片 9

 

假设是在API 14及以上版本,32行34行能够统黄金年代为:popup.inflate(Lacrosse.menu.main,
popup.getMenu());

留心第37行代码不要遗忘show。

运维程序,单击button,效果如下:

图片 10

末段,附上整个散文的代码:

【工程文件】

链接:http://pan.baidu.com/s/1eQ6EnUq 

密码:438o

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注