Menu菜单

使用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);
    }
}

猜你喜欢

转载自blog.csdn.net/weimeig/article/details/79712595