Menu菜单

2016-01-09

Android

原CSDN博客已弃用,文章会逐渐迁移过来。

使用XML文件定义菜单资源的好处

1、有利于观察菜单结构

2、菜单资源和逻辑代码分离,有利于维护

3、菜单资源可以被不同的平台、版本等所用

Menu菜单的创建方式:

一、使用XML方式创建:

1.在res上面右键->New->Android resource directory

2.点击之后,出现下图Resource type选择menu,名字随便起,点击ok

3.可以看到菜单栏已经出现了menu

4.menu上面右击,如下图选择:

5.file name自己随便起,点击ok

6.可以看到menu文件夹下,有一个main.XML文件,main是我起的文件名

7.打开main.XML文件,在里面写入代码

    <?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:id="@+id/font_group"  
        android:title="设置字体大小"  
        android:orderInCategory="3">  
    </item>  
    <item android:id="@+id/action_color"  
        android:title="设置字体颜色"  
        android:orderInCategory="1">  
    </item>  
    <item android:id="@+id/action_style"  
        android:title="设置字体样式"  
        android:orderInCategory="2">  
    </item>  
</menu>  
<!--  
    android:id="@+id/font_group"  设置当前菜单项的唯一标识  
    android:title="设置字体大小"   设置菜单项的文本  
    android:orderInCategory="3"   设置同种类菜单项的排列顺序  
-->  

8.再打开Activity.java文件,在里面重载onCreate()函数

 import android.graphics.Color;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.widget.TextView;  

/** 
 * 演示OptionMenu的使用 
 */  
public class MainActivity extends AppCompatActivity  {  

    private TextView tvShow;  
    private float fontSize=20.0f;  
    private static final int ITEMID=4;//菜单项的ID  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        tvShow=findViewById(R.id.tv_show);  
        tvShow.setTextSize(fontSize);//设置textView中初始的字体大小  
    }  

    /** 
     * 表示当activity创建选项菜单时回调的使用 
     * @param menu 
     * @return 
     *      true 用来显示菜单项 
     *      false 无法显示菜单项 
     */  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
//        MenuInflater inflater = getMenuInflater();  
//        inflater.inflate(R.menu.main,menu);  
        //创建菜单的第一种方式,xml文件  
        getMenuInflater().inflate(R.menu.main,menu);   //第一个参数是资源文件,第二个参数是menu对象  
    }  

    /** 
     * 表示当选项菜单中的item被选中时回调的方法 
     * @param item    表示菜单项对象 
     * @return 
     */  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        int itemId = item.getItemId();//获取当前点击菜单项的资源id  
        switch (itemId){  
            case R.id.font_group://点击设置字体大小  
                fontSize += 5;  
                tvShow.setTextSize(fontSize);  
                break;  
            case R.id.action_color://点击设置字体颜色  
                //随机生成颜色  
                int red = (int) (Math.random()*256);  
                int green = (int) (Math.random()*256);  
                int blue = (int) (Math.random()*256);  
                tvShow.setTextColor(Color.rgb(red,green,blue));  
                break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  
}  

9.activity_main的代码如下

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    >  
    <TextView  
        android:id="@+id/tv_show"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="设置字体"  
        android:textSize="20dp"/>  
</RelativeLayout>  

二、使用Java代码添加菜单的方法

.activity_main如上不变

在Java代码的onCreateOptionsMenu()方法中添加以下代码,即可为Menu菜单动态添加相应的菜单项

//add(groupId 菜单项分组 ,ItemId 菜单项唯一标识id,order 表示菜单项的排序,菜单项展示的文本)  
menu.add(Menu.NONE,ITEMID,Menu.NONE,"设置字体");  

Java文件代码如下:

import android.graphics.Color;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.widget.TextView;  

/** 
 * 演示OptionMenu的使用 
 */  
public class MainActivity extends AppCompatActivity  {  

    private TextView tvShow;  
    private float fontSize=20.0f;  
    private static final int ITEMID=4;//菜单项的ID  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        tvShow=findViewById(R.id.tv_show);  
        tvShow.setTextSize(fontSize);//设置textView中初始的字体大小  
    }  

    /** 
     * 表示当activity创建选项菜单时回调的使用 
     * @param menu 
     * @return 
     *      true 用来显示菜单项 
     *      false 无法显示菜单项 
     */  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        //add(groupId 菜单项分组 ,ItemId 菜单项唯一标识id,order 表示菜单项的排序,菜单项展示的文本)  
        menu.add(Menu.NONE,ITEMID,Menu.NONE,"设置字体");  
        return true;  
    }  

    /** 
     * 表示当选项菜单中的item被选中时回调的方法 
     * @param item    表示菜单项对象 
     * @return 
     */  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        //本方法内的使用参照上述xml写法的实现方法即可  
        return super.onOptionsItemSelected(item);  
    }  
}  

三、让Activity继承Activity的方法

将Activity原本继承的AppCompatActivity改成继承Activity

重写onMenuItemSelected方法

/** 
 * 表示菜单项中被点击回调的方法 
 * @param featureId 
 * @param item 
 * @return 
 */  
@Override  
public boolean onMenuItemSelected(int featureId, MenuItem item) {  
    int itemId = item.getItemId();  
    if(itemId==ITEMID){  
        tvShow.setText("调用了菜单项第二种点击事件");  
    }  
    return super.onMenuItemSelected(featureId, item);  
}  

有的小朋友会问,if(itemId==ITEMID)的这个ITEMID是什么,其实,这个数值是可以直接填一个菜单项ID的,这里写ITEMID是因为完整的代码的上面写了一句, private static final int ITEMID=4;//菜单项的ID

四、处理菜单项的第四种方式,在onCreateOptionsMenu()方法内添加监听事件

/** 
     * 表示当activity创建选项菜单时回调的使用 
     * @param menu 
     * @return 
     *      true 用来显示菜单项 
     *      false 无法显示菜单项 
     */  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        MenuItem item=menu.findItem(R.id.action_style);  
        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {  
            @Override  
            public boolean onMenuItemClick(MenuItem item) {  
                Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_LONG).show();  
                return false;  
            }  
        });  
        return true;  
    }  

菜单内还可以添加子菜单,如在菜单文件main下

<item android:id="@+id/font_group"  
    android:title="设置字体大小"  
    android:orderInCategory="3">  
    <!--设置子菜单-->  
    <item android:id="@+id/action_add" android:title="增大字体"></item>  
    <item android:id="@+id/action_sub" android:title="减小字体"></item>  
</item>  

那么如何给子菜单获得绑定事件呢

直接在绑定事件监听的方法里(如onOptionsItemSelected()方法),找到对应的资源ID即可

case R.id.action_add:  
    fontSize += 5;  
    tvShow.setTextSize(fontSize);  
    break;  

附上完整的Java代码

import android.app.Activity;  
import android.graphics.Color;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.widget.TextView;  
import android.widget.Toast;  

/** 
 * 演示OptionsMenu的使用 
 */  
public class MainActivity extends Activity {  
    private TextView tvShow;  
    private float fontSize=20.0f;  
    private static  final int ITEMID=4;//菜单项id  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        tvShow= (TextView) findViewById(R.id.tv_show);  
        tvShow.setTextSize(fontSize);//设置textview中初始的字体大小  
    }  

    /** 
     * 表示当activity创建选项菜单时回调的方法 
     * @param menu 
     * @return 
     *    true 用来显示菜单项 
     *    false 无法显示菜单项 
     */  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        //获取菜单填充器对象  
        // MenuInflater inflater=getMenuInflater();  
        // inflater.inflate(R.menu.main,menu);  

        //创建菜单的第一种方式  xml文件  
        getMenuInflater().inflate(R.menu.main,menu);  

        //创建菜单的第一种方式  代码  
        // add(groupId 菜单项分组,ItemId 菜单项唯一标示id,order 表示菜单项的排序  
        // ,菜单项展示的文本)  
        menu.add(Menu.NONE,ITEMID,Menu.NONE,"设置字体");  

        //处理菜单项点击事件的第三种方式  
        MenuItem item=menu.findItem(R.id.action_style);  
        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {  
            @Override  
            public boolean onMenuItemClick(MenuItem item) {  
                Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();  
                return false;  
            }  
        });  
        return true;  
    }  

    /** 
     * 表示当选项菜单中的item被选中时回调的方法 
     * @param item  表示菜单项对象 
     * @return 
     */  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        int itemId=item.getItemId();//获取当前点击菜单项的资源id  
        switch (itemId){  
            case R.id.action_add://点击设置字体大小  
                fontSize+=5;  
                tvShow.setTextSize(fontSize);  
                break;  
            case R.id.action_sub:  
                fontSize-=5;  
                tvShow.setTextSize(fontSize);  
                break;  
            case R.id.action_color://点击设置字体颜色  
                //随机生成颜色  
                int red= (int) (Math.random()*256);  
                int green= (int) (Math.random()*256);  
                int blue= (int) (Math.random()*256);  
                tvShow.setTextColor(Color.rgb(red,green,blue));  
                break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  

    /** 
     *  表示菜单项中被点击回调的方法 
     * @param featureId 
     * @param item 
     * @return 
     */  
    @Override  
    public boolean onMenuItemSelected(int featureId, MenuItem item) {  
        int itemId=item.getItemId();  
        if(itemId==ITEMID){  
            tvShow.setText("调用了菜单项第二种点击事件");  
        }  
        return super.onMenuItemSelected(featureId, item);  
    }  
}