Menu 基础知识
android提供的标准UI组件
menu 的总体概述
- menu 是 android 的一个重要组件
- menu 菜单是一款比较通用的用户体验的组件
- 从 Android 3.0 即 API 11 之后 android 系统没有提供单独的菜单按钮
Menu 菜单的分类
- 选项菜单(Options Menu);当用户触发 menu 项时弹出的菜单
- 上下文菜单(Context Menu):用户长按那个控件时弹出的类似对话框
- 弹出菜单(Pop Menu),当用户点击某个 View 视图是弹出的菜单
Menu 菜单的使用
1、使用 xml 文件加载 menu
Item 的属性:android:id 唯一标识菜单,android:title :菜单项的文本
android: orderInCategory:设置同种类菜单项的排列顺序
android:showAsAction="never|ifroom|always" 表示是否显示 写好以后直接在代码中写 getMenuInflator.inflate()加载进来即可
(1).选项菜单
- 当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选项菜单最多只有六个,超过六个第六个就会自动显示 更多 选项来展示显示。
- 创建方法:
- 覆盖 Activity 的 onCreateOptionsMenu(Menu menu)方法,当我们第一次打开时调用。
- 调用 Menu 的 add()方法添加菜单项(MenuItem),可以调用 MenuItem 的 setIcon()方法为菜单项设置图标。
- 当菜单项(MenuItem)被选中时,覆盖 Acitivy 的 onOptionsMenuSelected()方法响应事件。
(2)、上下文菜单
当用户长按 Activity 页面时,弹出的菜单我们称为上下文菜单。我们经常在 Windows 中用鼠标右键单击弹出的菜单就是上下文菜单。
- 1) 覆盖 Activity 的 onCreateContextMenu()方法,调用 Menu 的 add 方法添加菜单项MenuItem
- 2) 覆盖 onContextItemSelected()方法,响应菜单单击事件
- 3) 调用 registerForContextMenu()方法,为视图注册上下文菜单
(3)子菜单
子菜单就是将相同功能的分组进行多级显示的一种菜单,比如,Windows 的“文件”菜单中就有“新建”,“打开”,“关闭”等子菜单。创建子菜单的方法
- 1)、覆盖 Activity 的 onCreateOptionsMenu()方法,调用 Menu 的 addSubMenu()方法 添加子菜单项
- 2)、调用 SubMenu 的 add(),添加子菜单项
- 3)、覆盖 onCreateItemSelected()方法,响应菜单单击事件
4. 使用代码的方式加载弹出菜单
1) 在 Android 中使用代码加载菜单使用的是 menu 的 add()方法,。2) add()方法的参数需要重点掌握
5. 选项菜单的点击事件
选项菜单的点击事件有三种分别是如下代码所示:
第一种对于使用 xml 加载菜单的可以使用以下两种方式来添加点击事件onOptionsItemSelect
第二种点击事件在继承Activity类中 onMenuItemSelect
第三种点击事件对于那些使用代码加载的菜单可以使用以下方式添加点击事件 onMenuItemClickListener
具体使用哪一种点击事件大家个根据你实现的功能来选择
6. Menu 菜单的嵌套使用规则
- 1) Item 中可以嵌套 menu,但是不能嵌套 group
- 2) Menu 中既可以嵌套 group,又可以嵌套 item。
- 3) Group 中只能嵌套 item,不能嵌套 menu
7. 上下文菜单:
上下文菜单是和某一种控件绑定使用的,也就是说每个控件只有注册了上下文菜单,并且长 按时弹出的菜单就是上下文菜单,
- 调用 registerForContextMenu()方法,为视图注册上下文菜单
- 上下文菜单加载菜单是通过重写 onCreateContextMenu()来完成的,
- 上下文菜单的 点击事件是通过重写 onContextItemSelected()方法来实现的,具体代码如下
8.PopMenu:
- 拿到菜单项是通过创建 popMenu 的对象再通过菜单加载器将其加载进来的
- popMenu 的点击事件是通过 popMenu.setOnMenuItemClickListener()方法实现的。
实现代码如下:
写完以后一定要注意 show(),否则不能看到
综合案例:
通过xml布局文件写menu(推荐方法) main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--
item:菜单内容
title:菜单标题
orderInCategory:菜单显示顺序
-->
<!--设置font_group 的子菜单-->
<item
android:id="@+id/font_group"
android:orderInCategory="1"
android:title="@string/font_name">
<menu>
<item
android:id="@+id/str_add"
android:orderInCategory="1"
android:title="@string/str_add"></item>
<item
android:id="@+id/str_sub"
android:orderInCategory="2"
android:title="@string/str_sub"></item>
</menu>
</item>
<item
android:id="@+id/str_color"
android:orderInCategory="2"
android:title="@string/str_color"></item>
<item
android:id="@+id/str_style"
android:orderInCategory="3"
android:title="@string/str_style"></item>
</menu>
布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="操作字体!"
/>
</android.support.constraint.ConstraintLayout>
MainActivity.java实现
package com.demo.test;
import android.app.Activity;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* 去演示OptionsMenu的使用ø
*/
public class MainActivity extends Activity {
private TextView tv_show;
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);
tv_show = (TextView) findViewById(R.id.tv_show);
tv_show.setTextSize(fontSize);//给字体设置默认大小
}
/**
* 表示当activity创建菜单是回调的方法
*
* @param menu
* @return true 用来显示菜单项
* false 无法显示菜单项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//使用菜单填充器MenuInflater、加载菜单布局
/**
* 1、获得菜单填充器对象
* 2、将菜单项进行填充
*/
// MenuInflater inflater=getMenuInflater();
//inflater.inflate(R.menu.main,menu);
//创建菜单文件的第一种方式 xml文件
getMenuInflater().inflate(R.menu.main, menu);
//创建菜单文件的第二种方式 代码创建
//add(groupId 菜单项分组,ItemId 菜单项id,order id 表示菜单项排序,
// 菜单项展示的文本)
menu.add(Menu.NONE, ITEMID, Menu.NONE, "设置字体");
//选项菜单点击时处理的方法3 根据资源项菜单item的id,给菜单设置监听事件
MenuItem item = menu.findItem(R.id.str_style);//直接找到菜单项item的id
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
Toast.makeText(MainActivity.this, menuItem.getTitle().toString(),
Toast.LENGTH_SHORT).show();
return false;
}
});
return true;
}
/**
* 表示当选项菜单的item被选中时回调的方法
*
* @param item 表示菜单项对象
* @return
*/
//选项菜单点击时处理的方法1
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();//获取当前点击资源项的d
switch (itemId) {
// case R.id.font_group://点击设置字体大小
// fontSize+=5;//每次点击加5
// tv_show.setTextSize(fontSize);
// break;
case R.id.str_color://设置字体颜色
//随机生成颜色
int red = (int) (Math.random() * 256);
int green = (int) (Math.random() * 256);
int blue = (int) (Math.random() * 256);
tv_show.setTextColor(Color.rgb(red, green, blue));
break;
case R.id.str_add://font_group的子菜单增大字体
fontSize += 5;//每次点击加5
tv_show.setTextSize(fontSize);
break;
case R.id.str_sub:font_group的子菜单减小字体
fontSize -= 5;//每次点击加5
tv_show.setTextSize(fontSize);
break;
}
return super.onOptionsItemSelected(item);
}
//选项菜单点击时处理的方法2 继承Activity中的方法
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
int itemId = item.getItemId();
//也可以通过switch来判断是哪个选项的id
if (itemId == ITEMID)//设置字体的菜单项
tv_show.setText("我是Activity第二种设置菜单监听的方式");
return super.onMenuItemSelected(featureId, item);
}
}