目录:
1.Menu概述
2.Menu的一些常用属性
3.Menu分类
3.1 选项菜单(Option Menu)
3.2 上下文菜单(Context Menu)
3.3 弹出菜单(Popup Menu)
3.4 子菜单(Sub Menu)
1.Menu概述
Menu的样子和作用我想没有必要在说,通常我们在使用App的过程中都有见过它,有从底部弹出的,长按弹出的等等,不过底部弹出
菜单有被Actionbar overflow替换的趋势,因为底部菜单的调用需要设备硬件盘的Menu按键来调用,而在设备更迭中大多数设备已经弃掉
了硬件盘的Menu按键。
2.Menu的一些常用属性
3.Menu分类
3.1 选项菜单(Option Menu)
1)概述
选项菜单有被Actionbar overflow替代的趋势,他的调用主要是通过物理键盘的Menu键去调用,通常从设备的底部弹出,选项主要
是一些全局的操作。
2)Option menu代码实现(该方法不符合逻辑代码与UI显示的低耦合,让我们的代码特别的臃肿,所以不推荐使用)
3)Option menu xml实现(直观便于修改管理,推荐使用此方法创建)
(3.1)MainActivity.java
(3.2)option_menu.xml
4)效果截图
3.2 上下文菜单(Context Menu)
1)概述:
上下文菜单通常在UI中对某些特点资源执行一些操作,比如:删除、置顶、复制、收藏等等,都可以通过上下文菜单作为显示注册
到某个控件上,同时Context Menu通常通过长点击某个控件调出。
2)简单使用
(2.1)COntextMenuActivity.java
(2.2)context_menu.xml
(2.3)context_menu_activity.java
(2.4)效果截图
3.3 弹出菜单(Popup Menu)
1)概述:
Popup Menu与Popup window类似,他需要依附于某个View之上,通常menu显示于View下方。
2)Actionbar通过Popup menu实现弹出菜单,与overflow菜单类似
(2.1)隐藏Actionbar,准备使用toolbar
(2.2)主布局文件popup_menu_activity.xml
(2.3)菜单项布局文件popup_menu.xml
(2.4)主布局java类PopMenuActivity.java
(2.5)效果截图
3.4 子菜单(Sub Menu)
1)概述:
子菜单即菜单项下的菜单,比如某个操作的子操作有很多,像文件操作,子操作有文件新建,复制,剪切等等
2)简单使用
推荐文章:
http://blog.youkuaiyun.com/wlwlwlwl015/article/details/42170771
http://blog.youkuaiyun.com/books1958/article/details/44343001
http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
1.Menu概述
2.Menu的一些常用属性
3.Menu分类
3.1 选项菜单(Option Menu)
3.2 上下文菜单(Context Menu)
3.3 弹出菜单(Popup Menu)
3.4 子菜单(Sub Menu)
1.Menu概述
Menu的样子和作用我想没有必要在说,通常我们在使用App的过程中都有见过它,有从底部弹出的,长按弹出的等等,不过底部弹出
菜单有被Actionbar overflow替换的趋势,因为底部菜单的调用需要设备硬件盘的Menu按键来调用,而在设备更迭中大多数设备已经弃掉
了硬件盘的Menu按键。
2.Menu的一些常用属性
android:title="":设置菜单项的title
android:icon="":设置菜单项的icon
android:alphabeticShortcut="":字母快捷键
android:numericShortcut="":数字快捷键
android:checked="":设置菜单项是否被选中
android:checkable="":设置菜单项是否能选中
android:enabled="":设置菜单项是否可用
android:visible="":设置菜单项是否见
android:orderInCategory="1":设置菜单项顺序
android:showAsAction="always|ifRoom|withText|never":设置菜单项在anctionbar中是否放入overflow
3.Menu分类
3.1 选项菜单(Option Menu)
1)概述
选项菜单有被Actionbar overflow替代的趋势,他的调用主要是通过物理键盘的Menu键去调用,通常从设备的底部弹出,选项主要
是一些全局的操作。
2)Option menu代码实现(该方法不符合逻辑代码与UI显示的低耦合,让我们的代码特别的臃肿,所以不推荐使用)
package com.example.menu;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/*
* 创建选项菜单
* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*参数:
* 1、组别:如果不分组的话就写Menu.NONE,
*
* 2、Id: Android根据这个Id来确定不同的菜单
*
* 3、顺序:那个菜单现在在前面由这个参数的大小决定
*
* 4、文本: 菜单的显示文本
*/
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "删除").setIcon(
android.R.drawable.ic_menu_delete);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(
android.R.drawable.ic_menu_edit);
menu.add(Menu.NONE, Menu.FIRST + 3, 3, "帮助").setIcon(
android.R.drawable.ic_menu_help);
menu.add(Menu.NONE, Menu.FIRST + 4, 4, "添加").setIcon(
android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST + 5, 5, "详细").setIcon(
android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 6, 6, "发送").setIcon(
android.R.drawable.ic_menu_send);
return true;
}
/*
* 选项选择监听
* */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case Menu.FIRST+1:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+2:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+3:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+4:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+5:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+6:
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
3)Option menu xml实现(直观便于修改管理,推荐使用此方法创建)
(3.1)MainActivity.java
package com.example.menu;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public boolean onCreateOptionsMenu(Menu menu) {
//通过xml定义的menu
getMenuInflater().inflate(R.menu.option_menu,menu);
//返回true设置的菜单才会生效,这里super.onCreateOptionsMenu(menu)调用父类方法返回true
return true;
}
/*
* 选项选择监听
* */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
}
(3.2)option_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--
android:title="":设置菜单项的title
android:icon="":设置菜单项的icon
android:alphabeticShortcut="":字母快捷键
android:numericShortcut="":数字快捷键
android:checked="":设置菜单项是否被选中
android:checkable="":设置菜单项是否能选中
android:enabled="":设置菜单项是否可用
android:visible="":设置菜单项是否见
android:orderInCategory="1":设置菜单项顺序
android:showAsAction="always|ifRoom|withText|never":设置菜单项在anctionbar中是否放入overflow
-->
<item android:id="@+id/delete"
android:icon="@android:drawable/ic_input_delete"
android:orderInCategory="1"
android:title="删除"
/>
<item android:id="@+id/save"
android:icon="@android:drawable/ic_menu_edit"
android:orderInCategory="3"
android:title="保存"/>
<item android:id="@+id/help"
android:icon="@android:drawable/ic_menu_help"
android:orderInCategory="2"
android:title="帮助"/>
<item android:id="@+id/send"
android:icon="@android:drawable/ic_menu_send"
android:orderInCategory="4"
android:title="发送"/>
</menu>
4)效果截图
3.2 上下文菜单(Context Menu)
1)概述:
上下文菜单通常在UI中对某些特点资源执行一些操作,比如:删除、置顶、复制、收藏等等,都可以通过上下文菜单作为显示注册
到某个控件上,同时Context Menu通常通过长点击某个控件调出。
2)简单使用
(2.1)COntextMenuActivity.java
package com.example.menu;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* Created by elimy on 2016-09-01.
*/
public class ContextMenuActivity extends AppCompatActivity {
ArrayList<String> arrayList = new ArrayList<String>();
ArrayAdapter adapter;
ListView listView ;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.context_menu_activity);
//初始化listview
listView = (ListView) findViewById(R.id.context_menu_lv);
//初始化数组
for (int i=0;i<10;i++){
arrayList.add("数据"+i);
}
//初始化adapter
adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,arrayList);
//设置适配器
listView.setAdapter(adapter);
//注册上下文菜单
registerForContextMenu(listView);
}
/*
* 创建选项菜单方法
* */
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//声明并初始化menu布局加载器
MenuInflater inflater= getMenuInflater();
//适配加载定义的menu xml
inflater.inflate(R.menu.context_menu,menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
Toast.makeText(ContextMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}
}
(2.2)context_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/delete"
android:icon="@android:drawable/ic_input_delete"
android:orderInCategory="1"
android:title="删除"
/>
<item android:id="@+id/save"
android:icon="@android:drawable/ic_menu_edit"
android:orderInCategory="3"
android:title="保存"/>
<item android:id="@+id/help"
android:icon="@android:drawable/ic_menu_help"
android:orderInCategory="2"
android:title="帮助"/>
<item android:id="@+id/send"
android:icon="@android:drawable/ic_menu_send"
android:orderInCategory="4"
android:title="发送"/>
</menu>
(2.3)context_menu_activity.java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/context_menu_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
(2.4)效果截图
3.3 弹出菜单(Popup Menu)
1)概述:
Popup Menu与Popup window类似,他需要依附于某个View之上,通常menu显示于View下方。
2)Actionbar通过Popup menu实现弹出菜单,与overflow菜单类似
(2.1)隐藏Actionbar,准备使用toolbar
<activity android:name=".PopMenuActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(2.2)主布局文件popup_menu_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:background="@color/colorAccent"
android:layout_height="?actionBarSize">
<ImageView
android:layout_marginLeft="160dp"
android:id="@+id/menu_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/expand_more_24"/>
</android.support.v7.widget.Toolbar>
</RelativeLayout>
(2.3)菜单项布局文件popup_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:context=".SecondActivity">
<!--查询按钮-->
<item android:id="@+id/action_serach"
android:title="搜索"
android:orderInCategory="1"
android:icon="@drawable/search_24"
/>
<!--分享-->
<item android:id="@+id/action_share"
android:title="分享"
android:orderInCategory="2"
android:icon="@drawable/share_24"
/>
<!--设置-->
<item android:id="@+id/action_setting"
android:title="设置"
android:orderInCategory="3"
android:icon="@drawable/rating"
/>
</menu>
(2.4)主布局java类PopMenuActivity.java
package com.example.menu;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.internal.view.menu.MenuBuilder;
import android.support.v7.internal.view.menu.MenuPopupHelper;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by elimy on 2016-09-01.
*/
public class PopMenuActivity extends AppCompatActivity {
PopupMenu popupMenu;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pop_menu_activity);
//声明并初始化
final ImageView imageView = (ImageView) findViewById(R.id.menu_iv);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//toolbar设置标题
toolbar.setTitle("弹出自定义菜单");
//设置title颜色
toolbar.setTitleTextAppearance(PopMenuActivity.this,R.style.Theme_Toolbar_Title);
//设置显示toolbar
setSupportActionBar(toolbar);
//为图片设置监听
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//初始化PopupMenu
popupMenu = new PopupMenu(PopMenuActivity.this,imageView);
//通过menu布局加载器适配菜单
getMenuInflater().inflate(R.menu.pop_menu,popupMenu.getMenu());
try {
//通过反射获取PopupMenu类的mPopup成员变量
Field field = popupMenu.getClass().getDeclaredField("mPopup");
//设置为可接近,可访问,因为mPopup在PopupMenu类中为私有属性
field.setAccessible(true);
//通过属性get方法获取属性的类MenuPopupHelper的类对象
MenuPopupHelper menuPopupHelper = (MenuPopupHelper) field.get(popupMenu);
//设置强制显示icon
menuPopupHelper.setForceShowIcon(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//显示popupMenu
popupMenu.show();
//设置监听器
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(PopMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
return false;
}
});
}
});
}
}
(2.5)效果截图
3.4 子菜单(Sub Menu)
1)概述:
子菜单即菜单项下的菜单,比如某个操作的子操作有很多,像文件操作,子操作有文件新建,复制,剪切等等
2)简单使用
package com.example.menu;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
/**
* Created by elimy on 2016-09-02.
*/
public class SubMenuActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub_menu_activity);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu share =menu.addSubMenu("分享");
SubMenu edit = menu.addSubMenu("编辑");
SubMenu file = menu.addSubMenu("文件");
share.add(0,Menu.FIRST,1,"分享到微信");
share.add(0,Menu.FIRST+1,2,"分享到微博");
//去掉子菜单头部
//share.clearHeader();
//设置父选项图标,需要强制显示才能看到
//share.setIcon(R.drawable.share_24);
//设置子选项头部显示图标
//share.setHeaderIcon(R.drawable.share_24);
edit.add(0,Menu.FIRST+2,0,"复制");
edit.add(0,Menu.FIRST+3,1,"剪切");
file.add(0,Menu.FIRST+4,1,"打开");
file.add(0,Menu.FIRST+5,2,"新建");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case Menu.FIRST:
Toast.makeText(SubMenuActivity.this,"点击了分享到微信",Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+1:
Toast.makeText(SubMenuActivity.this,"点击了分享到微博",Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+2:
Toast.makeText(SubMenuActivity.this,"点击了复制",Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+3:
Toast.makeText(SubMenuActivity.this,"点击了剪切",Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+4:
Toast.makeText(SubMenuActivity.this,"点击了打开",Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST+5:
Toast.makeText(SubMenuActivity.this,"点击了新建",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
推荐文章:
http://blog.youkuaiyun.com/wlwlwlwl015/article/details/42170771
http://blog.youkuaiyun.com/books1958/article/details/44343001
http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html