menu-菜单(选项菜单、上下文菜单、弹出式菜单)

1.选项菜单(按菜单键)  optionmenu是相对于activity的菜单 需要按菜单键

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    /**
     * 创建选项菜单 ,如果设置隐藏标题就不会显示该菜单按钮了(右上角三个点)
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //将在xml文件中设置的菜单项添加到系统的menu里
        getMenuInflater().inflate(R.menu.main, menu);
        //在代码中添加菜单项
        //参数1 表示分组id,值通常为Menu.NONE  参数2:表示的是item的id  参数3:表示排序   参数4:表示的是菜单文本
        menu.add(Menu.NONE, 1, 104, "在代码中添加的01");
        menu.add(Menu.NONE, 2, 105, "在代码中添加的02");
        //在代码中添加多级菜单
        SubMenu subMenu = menu.addSubMenu(Menu.NONE, 3, 106, "代码中添加的包含子菜单");
        subMenu.add(Menu.NONE, 4, 100, "第一个儿子");
        subMenu.add(Menu.NONE, 5, 101, "第二个儿子");
        return true;
    }
    /**
     * 选项菜单的单击事件
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.item01:
            Toast.makeText(this, "点击-"+item.getTitle(), 0).show();
            break;
        case R.id.item02:
            Toast.makeText(this, "点击-"+item.getTitle(), 0).show();
            break;
        case R.id.item03:
            Toast.makeText(this, "点击item03", 0).show();
            break;
        case R.id.item04_01:
            Toast.makeText(this, "点击item04_01", 0).show();
            break;
            //为在代码中添加的菜单设置单击事件
        case 1:
            Toast.makeText(this, "点击了在代码中添加的01", 0).show();
            break;
        case 2:
            Toast.makeText(this, "点击了在代码中添加的02", 0).show();
            break;
        case 4:
            Toast.makeText(this, "点击了-"+item.getTitle(), 0).show();
            break;
        case 5:
            Toast.makeText(this, "点击了第二个儿子", 0).show();
            break;
        }
        return super.onOptionsItemSelected(item);
    }
    
    /**
     *(选项菜单,上下文菜单)的菜单事件都会先执行该方法,再去执行相应的监听事件
     */
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        System.out.println("只要点击了菜单项就会执行,并且先于上面的事件");
        return super.onMenuItemSelected(featureId, item);
    }
}

说明:contextmenu和optionsmenu的点击事件都会先触发onMenuItemSelected该方法,然后该方法再根据menu特征分发到不同的

菜单相应事件,contextmenu触发onContextItemSelected,    optionsmenu触发onOptionsItemSelected

menu下的main.xml 

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <!--
         showAsAction代表菜单项显示的位置   设置为never就行(点击菜单项才显示出来)
        orderInCategory 代表菜单的排序(从小到大) 
showAsAction 用来控制菜单的显示位置
  当时同时设置了 titile和icon属性的时候 icon属性优先于title显示 ,
  在折叠菜单中不会显示icon,只会显示title
  在actionBar中长按图标会显示title的值
showAsAction的属性值:
  never 从来不显示在actionbar始终显示在折叠菜单中(三个点里)
  always 始终显示在actionbar上
  ifRoom 如果actionbar上有空间,将该图标显示在actionbar上
  withText 通常配合ifroom使用,当actionbar上有足够的空间的时候,会将图标和文本同时显示
  collapseActionView 通常配合ifroom使用,当actionbar上有足够的空间的时候,会将菜单卷缩成图片
-->
    <item
        android:id="@+id/item01"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="菜单项1"/>
    <item
        android:id="@+id/item02"
        android:orderInCategory="101"
        android:title="菜单项2"/>
    <item
        android:id="@+id/item03"
        android:orderInCategory="102"
        android:title="菜单项3"/>
    <!-- 添加子菜单 -->
    <item
        android:orderInCategory="103"
        android:title="包含子菜单">
        <menu>
            <item
                android:id="@+id/item04_01"
                android:title="子菜单1"/>
            <item
                android:id="@+id/item04_02"
                android:title="子菜单1"/>
        </menu>
    </item>
</menu>

效果图:

    

2.上下文菜单   contextmenu相对于view 需要长按对应的控件 以对话框的形式展示

 1 public class MainActivity2 extends Activity {
 2     private TextView tv;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7         tv = (TextView) findViewById(R.id.textview);
 8         registerForContextMenu(tv);//为文本注册一个上下文菜单(长按该文本出现菜单选项)    
 9     }
10     @Override
11     public void onCreateContextMenu(ContextMenu menu, View v,
12             ContextMenuInfo menuInfo) {
13         getMenuInflater().inflate(R.menu.main2, menu);//注册菜单选项
14         super.onCreateContextMenu(menu, v, menuInfo);
15         
16     }
17     @Override
18     public boolean onContextItemSelected(MenuItem item) {//菜单项单击事件
19         switch(item.getItemId()){
20             case R.id.red:
21                 tv.setBackgroundColor(Color.RED);
22                 break;
23             case R.id.bull:
24                 tv.setBackgroundColor(Color.BLUE);
25                 break;
26             case R.id.green:
27                 tv.setBackgroundColor(Color.GREEN);
28                 break;
29         }
30         return super.onContextItemSelected(item);
31     }
32 }

menu下的main2.xml 菜单选项文件(在xml中添加菜单)

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

    <item
        android:id="@+id/red"
        android:orderInCategory="101"
        android:title="红色"/>
    <item
        android:id="@+id/bull"
        android:orderInCategory="102"
        android:title="绿色"/>
    <item
        android:id="@+id/green"
        android:orderInCategory="103"
        android:title="蓝色"/>

</menu>

3.弹出式菜单(如:按 按钮出现菜单) 泡泡菜单,菜单放在对应的控件下面,不能自动触发

 1 public class MainActivity3 extends Activity {
 2     @Override
 3     protected void onCreate(Bundle savedInstanceState) {
 4         super.onCreate(savedInstanceState);
 5         setContentView(R.layout.activity_main);
 6         Button but=(Button) findViewById(id.button);
 7         but.setOnClickListener(new View.OnClickListener() {
 8             @Override
 9             public void onClick(final View v) {
10                 PopupMenu pop=new PopupMenu(MainActivity3.this, v);//new一个弹出式菜单 表示将popupmenu放到对应的控件下方(左对齐)
11                 pop.getMenuInflater().inflate(R.menu.main, pop.getMenu());//注册菜单项
12                 pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {//单击事件
13                     @Override
14                     public boolean onMenuItemClick(MenuItem item) {
15                         switch (item.getItemId()) {
16                         case R.id.start:
17                             Toast.makeText(MainActivity3.this,"开始游戏", 0).show();
18                             break;
19                         case R.id.set:
20                             Toast.makeText(MainActivity3.this,"设置游戏", 0).show();
21                             break;
22                         case R.id.item_01:
23                             Toast.makeText(MainActivity3.this,"声音游戏", 0).show();
24                             break;
25                         case R.id.item_02:
26                             Toast.makeText(MainActivity3.this,"背景设置", 0).show();
27                             break;    
28                         case R.id.exit:
29                             Toast.makeText(MainActivity3.this,"退出游戏", 0).show();
30                             break;
31                         default:
32                             break;
33                         }
34                         return false;
35                     }
36                 });
37                 pop.show();//显示
38             }
39         });
40     }
41     
42 }

menu下的main.xml 菜单选项文件(在xml中添加菜单)

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

    <item
        android:id="@+id/start"
        android:orderInCategory="101"
        android:showAsAction="never"
        android:title="开始游戏"/>
    <item
        android:id="@+id/set"
        android:orderInCategory="101"
        android:showAsAction="never"
        android:icon="@android:drawable/ic_delete"
        android:title="设置游戏">
         <menu >
            <item  android:id="@+id/item_01"
            android:orderInCategory="101"
            android:showAsAction="never"
            android:title="声音设置"/>  
               
            <item  android:id="@+id/item_02"
            android:orderInCategory="101"
            android:showAsAction="never"
            android:title="背景设置"/>             
         </menu>
        
     </item>
    <item
        android:id="@+id/exit"
        android:orderInCategory="101"
        android:showAsAction="never"
        android:title="退出游戏"/>

</menu>

item里的menu为子菜单

 

上面代码需要的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textview"
        android:textSize="30sp"
        android:text="长按改变背景颜色" />
    <Button  android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="请选择"/>

</RelativeLayout>

 

posted @ 2016-04-24 17:30  ts-android  阅读(1373)  评论(0编辑  收藏  举报