当前位置: 首页 > news >正文

Android菜单Menu详解

菜单资源文件通常放置在res\menu目录下,在创建项目时,默认不自动创建menu目录,所以需手动创建。
Android Resource Directory→ value menu
或在创建根元素<menu></menu>标记的xml文件对自动气建眼
res→Android Resounce File →Resource type→menu
子元素<item></iten><group></group>

<item>liter>标记常用属性,描述:

andraid: id  设置ID,也就是唯一标识。
android: title  设置标题。
android: alphabeticShortcut  指定字符快捷键。
android: numericShortcut  指定数字快捷键。
android: enabled  是否可用。
android: checkable  是否可选。
android: visible  是否可见。
android: checked  是否已选用。
android: icon  指定图标,需重写onMenuOpened方法并在其中调用设置显示图标才会在列表项中显示图标(重写方法)。
app: showAsAction  该属性用于溢出菜单控制菜单项在导航栏上展示位置。值可为:

always  总是在导航栏上显示菜单图标。
ifRoom  如果导航栏右侧有空间,该项就直接显示在导航栏上,不再放入溢出菜单。
never  从不在导航栏上显示,一直放在溢出菜单列表中。
withText  如果能在导航栏上显示,除了显示图标还要显示该项的文字说明。
collapseActionView  操作视图要折叠为一个按钮,点击该按钮再展示操作视图主要用于Searchview

<group></group>标记常用属性,描述:

android: id  为菜单组设置ID。
android: checkableBehavior  指定菜单组选择行为,值可为none(不可选)、all(多选)、single(单选)。
android: menuCategory  对某单组进行分类,指定优先级,值可为containersystemsecondaryalternative
android: enable  指定该菜单组中全部 单项是否可用
android: visible  指定该菜单组中全部某单项是否可见

<item>标记中还可包含<menu>标记,用于显示子菜单。
<group>标记中可有多个<item>标记,用于组成菜单组。

//例
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><item android:title="item1"android:icon="@drawable/zerotwo"app:showAsAction="always"/><item android:title="item2"><menu><item android:title="item2_1"/><item android:title="item2_2"/></menu></item><group><item android:title="item3"/><item android:title="item4"/></group></menu>

1. 上下文菜单

长按注册的控件显示菜单。

public class MainActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {... ...TextView textView=findViewById(R.id.textView);registerForContextMenu(textView);}public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {//用于创建菜单(上下文菜单)MenuInflater menuInflater=new MenuInflater(this);menuInflater.inflate(R.menu.test,menu);}public boolean onContextItemSelected(MenuItem item) {//用于选择菜单项(上下文菜单)int id=item.getItemId();if(id==R.id.~){~}return true;}}

2. 选项菜单

点击标题栏或工具栏最右侧三个点显示菜单

如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏。

public class MainActivity extends AppCompatActivity {public boolean onCreateOptionsMenu(Menu menu) {//用于创建菜单(选项菜单/溢出菜单)MenuInflater menuInflater=new MenuInflater(this);menuInflater.inflate(R.menu.test,menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {//用于选择菜单项(选项菜单/溢出菜单)int id=item.getGroupId();if(id==R.id.~){~}return true;}}

3. 溢出菜单

溢出菜单和选项菜单并无较大差别,均是点击标题栏ActionBar或工具栏ToolBar最右侧三个点显示菜单
如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏。

菜单栏默认不在某单列表中显示图标;可制作自定义方法来使其显示图标。

//用于使菜单项在列表中显示图片的自定义方法
class MyMenuUtil{public static void setOverflowIconVisible(int featureId,Menu menu){//ActionBar的featureId是8,ToolBar的featureId是108if(featureId%100== Window.FEATURE_ACTION_BAR&&menu!=null){if(menu.getClass().getSimpleName().equals("MenuBuilder")){try {//setOptionalIconsVisible是隐藏方法,需要反射机制调用。Method m=menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);m.setAccessible(true);m.invoke(menu,true);}catch (Exception e){e.printStackTrace();}}}}
}
public class MainActivity extends AppCompatActivity {public boolean onMenuOpened(int featureId, Menu menu) {//打开菜单时调用//设置在菜单栏中显示图标MyMenuUtil.setOverflowIconVisible(featureId,menu);return super.onMenuOpened(featureId, menu);}public boolean onCreateOptionsMenu(Menu menu) {//用于创建菜单(溢出菜单/选项菜单)MenuInflater menuInflater=new MenuInflater(this);menuInflater.inflate(R.menu.test,menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {//用于选择菜单项(溢出菜单/选项菜单)int itemId=item.getItemId();int groupId=item.getGroupId();if(itemId==R.id.~){~}return true;}
}

http://www.lryc.cn/news/219446.html

相关文章:

  • win10 + cmake3.17 + vs2017编译osgearth2.7.0遇到的坑
  • 【Linux网络编程_TCP/UDP_字节序_套接字 实现: FTP 项目_局域网聊天项目 (已开源) 】.md updata:23/11/05
  • SpringBoot日志基础
  • linux文章导航栏
  • Adobe:受益于人工智能,必被人工智能反噬
  • VScode配置 github 上传代码
  • mysql根据条件导出表数据(`--where=“文本“`)
  • MySQL复习总结(二):进阶篇(索引)
  • java APP自动化测试AppIum
  • 【洛谷 P1303】A*B Problem 题解(高精度+字符串)
  • 计算机网络(43)
  • Ipswitch WS_FTP 12 安裝
  • 二十三种设计模式全面解析-解密组合模式(Composite Pattern):构建统一而强大的对象结构
  • 为什么路由器属于网络层
  • 【0基础学Java第七课】-- 类和对象01
  • 一个JS版寻路的实现
  • Java web应用的目录结构
  • 【Mac环境搭建】JDK安装、多JDK安装与切换
  • C++: 类和对象(中)
  • 图片批量归类:告别混乱,实现高效文件管理
  • 187. 重复的DNA序列 --力扣 --JAVA
  • Mysql高级——Mysql8一主一从,多主多从搭建
  • 【Qt5】QNetworkAccessManager
  • zookeeper节点类型
  • 【C++】一篇文章搞懂auto关键字及其相关用法!
  • 微信小程序overflow-x超出部分样式不渲染
  • Oracle常用运维SQL-SQL执行性能及锁表等查询分析
  • 安装MySQL时出现 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。
  • 【基础IO⑧】:文件描述符fd(进程与文件的联系)
  • 搭建WAMP网站教程(windows+apache+mysql+php)