• Android菜单Menu详解


    目录

    1. 上下文菜单

    2. 选项菜单

    3. 溢出菜单

    4. 弹出菜单-PopupMenu

    5. 自定义菜单(菜单项)


    菜单资源文件通常放置在res\menu目录下,在创建项目时,默认不自动创建menu目录,所以需手动创建。
    Android Resource Directory→ value menu
    或在创建根元素

    标记的xml文件对自动气建眼
    res→Android Resounce File →Resource type→menu
    子元素

    标记常用属性,描述:

    android: checkableBehavior  用于定义菜单项的选中行为。值可为none(默认值,表示菜单项没有选中状态,无法选择),single(表示只能选择一个菜单项,选择一个菜单项会自动取消其他菜单项的选择状态),all(表示所有菜单项都可以选择,没有互斥的关系)。

    标记常用属性,描述:

    andraid: id  设置ID,也就是唯一标识。
    android: title  设置标题。
    android: alphabeticShortcut  指定字符快捷键。
    android: numericShortcut  指定数字快捷键。
    android: enabled  是否可用。
    android: checkable  是否可选。
    android: visible  是否可见。
    android: checked  是否已选用。
    android: icon  指定图标,需重写onMenuOpened方法并在其中调用设置显示图标才会在列表项中显示图标(重写方法)。

    app: actionLayout  用于设置自定义的菜单项布局。在设置本属性时请不要设置title,可能会导致冲突,可用tools:ignore="MenuTitle"替代title。

    app: actionViewClass  用于指定操作按钮的视图类的 XML 属性。值可为"androidx.appcompat.widget.SearchView"(搜索框)等。

    app: showAsAction  该属性用于溢出菜单控制菜单项在导航栏上展示位置。值可为:

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

    标记常用属性,描述:

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

    标记中还可包含

    标记,用于显示子菜单。
    标记中可有多个标记,用于组成菜单组。

    1. //例
    2. "1.0" encoding="utf-8"?>
    3. <menu xmlns:android="http://schemas.android.com/apk/res/android"
    4. xmlns:app="http://schemas.android.com/apk/res-auto">
    5. <item android:title="item1"
    6. android:icon="@drawable/zerotwo"
    7. app:showAsAction="always"/>
    8. <item android:title="item2">
    9. <menu>
    10. <item android:title="item2_1"/>
    11. <item android:title="item2_2"/>
    12. menu>
    13. item>
    14. <group>
    15. <item android:title="item3"/>
    16. <item android:title="item4"/>
    17. group>
    18. menu>

    1. 上下文菜单

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

    无法对其列表中菜单项进行自定义布局,使用app:actionLayout属性无效。

    1. public class MainActivity extends AppCompatActivity {
    2. protected void onCreate(Bundle savedInstanceState) {
    3. ... ...
    4. TextView textView=findViewById(R.id.textView);
    5. registerForContextMenu(textView);
    6. }
    7. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    8. //用于创建菜单(上下文菜单)
    9. getMenuInflater().inflate(R.menu.test,menu);
    10. }
    11. public boolean onContextItemSelected(MenuItem item) {
    12. //用于选择菜单项(上下文菜单)
    13. int id=item.getItemId();
    14. if(id==R.id.~){
    15. ~
    16. }
    17. return true;
    18. }
    19. }

    2. 选项菜单

    溢出菜单和选项菜单仅作为操作栏的扩展,无法对其列表中菜单项进行自定义布局,使用app:actionLayout属性无效。

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

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

    使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

    1. public class MainActivity extends AppCompatActivity {
    2. public boolean onCreateOptionsMenu(Menu menu) {
    3. //用于创建菜单(选项菜单/溢出菜单)
    4. MenuInflater menuInflater=getMenuInflater().inflate(R.menu.test,menu);
    5. return true;
    6. }
    7. public boolean onOptionsItemSelected(MenuItem item) {
    8. //用于选择菜单项(选项菜单/溢出菜单)
    9. int id=item.getGroupId();
    10. if(id==R.id.~){
    11. ~
    12. }
    13. return true;
    14. }
    15. }

    3. 溢出菜单

    溢出菜单和选项菜单仅作为操作栏的扩展,无法对其列表中菜单项进行自定义布局,使用app:actionLayout属性无效。

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

    使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

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

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

    4. 弹出菜单-PopupMenu

    点击控件触发;效果与上下文菜单类似。

    无法对其列表中菜单项进行自定义布局,使用app:actionLayout属性无效。

    1. //触发的控件
    2. Button button=findViewById(R.id.button);
    3. //监听器
    4. button.setOnClickListener(new View.OnClickListener() {
    5. public void onClick(View view) {
    6. //创建PopupMenu对象,参数为环境、触发控件
    7. PopupMenu popupMenu=new PopupMenu(MainActivity.this,view);
    8. //填充菜单
    9. popupMenu.getMenuInflater().inflate(R.menu.navigation_view_menu,popupMenu.getMenu());
    10. //为弹出菜单设置菜单项监听器
    11. popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    12. public boolean onMenuItemClick(MenuItem menuItem) {
    13. //点击菜单项执行
    14. int menuItemId=menuItem.getItemId();
    15. return true;
    16. }
    17. });
    18. //展示菜单
    19. popupMenu.show();
    20. }
    21. });

    5. 自定义菜单(菜单项)

    部分控件所含菜单的菜单项允许自定义布局,在菜单项中添加app:actionLayout属性即可自定义菜单项布局。在设置本属性时请不要设置title,可能会导致冲突,可用tools:ignore="MenuTitle"替代title。

    请注意是app:actionLayout不是android:actionLayout

    1. "1.0" encoding="utf-8"?>
    2. "http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. xmlns:app="http://schemas.android.com/apk/res-auto">
    5. android:id="itemId"
    6. app:actionLayout="@layout/menu_item_layout"
    7. tools:ignore="MenuTitle" />
  • 设置自定义菜单项中的子控件;使用自定义菜单项时可使用menu.findItem()获取指定菜单项,然后使用getActionView()获取菜单项的View,最后使用view.findViewById()获取指定控件。

    1. //如为自定义菜单项,可进行子控件设置
    2. //例:
    3. Menu menu=view.getMenu();
    4. View menuItemView=menu.findItem(R.id.item1).getActionView();
    5. ImageView imageView=menuItemView.findViewById(R.id.~);
    6. imageView.setImageResource(R.drawable.~);

    允许使用自定义菜单项菜单的控件NavigationView(导航控件)。

  • 相关阅读:
    快速构建后台管理系统-RUOYI学习之-前端分不分离
    使用Docker部署debezium来监控 MySQL 数据库
    UE5 C++报错:is not currently enabled for Live Coding
    Vue中父子组件通信方式
    java基于springboot+vue驾校预约网站管理系统
    React - 插槽
    数据脱敏前沿实践分享,筑造数据安全边界 | 极客星球
    Python爬虫——爬虫基础模块和类库(附实践项目)
    2023/09/10
    多功能电力仪表在物联网的应用
  • 原文地址:https://blog.csdn.net/m0_57150356/article/details/134218825