Android入门第34天-Android的Menu组件使用大全

Posted TGITCIC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android入门第34天-Android的Menu组件使用大全相关的知识,希望对你有一定的参考价值。

简介

android有不同的菜单:

  • 系统菜单
  • 弹出菜单(可自定义样式)
  • Context Menu;
  • 子菜单;

菜单的使用和我们前面说的AlertDialog很像。它可以支持自定义样式、也可以对菜单的点击事件进行绑定。

Android里有几个MainActivity事件可以覆盖,其中有以下几个事件就是用于处理Menu的。

  • onCreateOptionsMenu(Menu menu),在这个方法里如果你使用menu.add就可以实现在Android的手机里右上角的...图标点击出现系统菜单的效果;

  • onOptionsItemSelected(MenuItem item),这个方法里可以进行每个系统菜单项点击的处理事件;

  • onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) ,这个是用来创建ContextMenu的,即这个菜单可以绑定在一个组件上,比如说按一下一个组件,对于这个组件的菜单就会被弹出。但是它要启作用必须在程序运行开始时调用一下Activity里的自带方法:registerForContextMenu(View view);来指定,ContextMenu绑定在哪个组件的身上;

  • onContextItemSelected(MenuItem item),相应的对于ContextMenu的每一个item的点击处理方法,用户可以自定义和覆盖里面的逻辑;

课程目标

  1. 做一个可以改变屏幕中间TextView字体颜色的系统菜单;
  2. 点一下按钮弹出一个PopMenu;
  3. 对于一个TextView绑定一个ContextMenu;

代码

前端代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/viewContext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="长按出context menu"
        android:textSize="18sp" />
 
    <TextView
        android:id="@+id/textColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="选择菜单改变颜色"
        android:textSize="18sp" />
 
 
    <Button
        android:id="@+id/btnShowMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textColor"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="展示弹出菜单" />
 
 
</RelativeLayout>

 系统菜单

前端代码

不需要

后端代码

MainActivity.java

系统菜单涉及到两个方法的覆盖,因此只要在这两个方法把系统菜单设上,同时对系统菜单的“选择”事件做出自定义即可,在此我们通过系统菜单改变屏幕中一行字的字体颜色

//1.定义不同颜色的菜单项的标识:
  private final int RED = 101;
  private final int GREEN = 102;
  private final int BLUE = 103;
  private final int YELLOW = 104;
  private final int GRAY = 105;
  private final int CYAN = 106;
  private final int BLACK = 107;
@Override
 public boolean onCreateOptionsMenu(Menu menu) 
     // Inflate the menu; this adds items to the action bar if it is present.
     menu.add(1, RED, 4, "红色");
     menu.add(1, GREEN, 2, "绿色");
     menu.add(1, BLUE, 3, "蓝色");
     menu.add(1, YELLOW, 1, "黄色");
     menu.add(1, GRAY, 5, "灰色");
     menu.add(1, CYAN, 6, "蓝绿色");
     menu.add(1, BLACK, 7, "黑色");
     return true;
 
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) 
     int id = item.getItemId();
     switch (id) 
         case RED:
             textColor.setTextColor(Color.RED);
             break;
         case GREEN:
             textColor.setTextColor(Color.GREEN);
             break;
         case BLUE:
             textColor.setTextColor(Color.BLUE);
             break;
         case YELLOW:
             textColor.setTextColor(Color.YELLOW);
             break;
         case GRAY:
             textColor.setTextColor(Color.GRAY);
             break;
         case CYAN:
             textColor.setTextColor(Color.CYAN);
             break;
         case BLACK:
             textColor.setTextColor(Color.BLACK);
             break;
     
     return super.onOptionsItemSelected(item);
 

弹出菜单

前端代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/mcat" android:title="一只喵" />
    <item android:id="@+id/mdog" android:title="一只汪" />
</menu>

 后端代码

   btnShowMenu.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            PopupMenu popup = new PopupMenu(MainActivity.this,btnShowMenu);
            popup.getMenuInflater().inflate(R.menu.pop_menu, popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
                @Override
                public boolean onMenuItemClick(MenuItem item) 
                    switch (item.getItemId())
                        case R.id.mcat:
                            Toast.makeText(MainActivity.this,"你轻拍了一下喵",
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case R.id.mdog:
                            Toast.makeText(MainActivity.this,"你轻拍了一下汪",
                                    Toast.LENGTH_SHORT).show();
                            break;
                    
                    return true;
                
            );
            popup.show();
        
    );

ContextMenu

前端

context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="none">
        <item android:id="@+id/blue" android:title="@string/font_blue"/>
        <item android:id="@+id/green" android:title="@string/font_green"/>
        <item android:id="@+id/red" android:title="@string/font_red"/>
    </group>
</menu>

后端

我们可以看到这个ContextMenu是绑定在一个TextView上的。

viewContext=(TextView)findViewById(R.id.viewContext);
registerForContextMenu(viewContext);
 
   //重写上下文菜单的创建方法
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenu.ContextMenuInfo menuInfo) 
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.context_menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    
    //上下文菜单被点击是触发该方法
    @Override
    public boolean onContextItemSelected(MenuItem item) 
        switch (item.getItemId()) 
            case R.id.blue:
                viewContext.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                viewContext.setTextColor(Color.GREEN);
                break;
            case R.id.red:
                viewContext.setTextColor(Color.RED);
                break;
        
        return true;
    

所以,请各位动一下手自己试试吧。

以上是关于Android入门第34天-Android的Menu组件使用大全的主要内容,如果未能解决你的问题,请参考以下文章

Android入门第18天-Android里的SeekBar的使用

Android入门第17天-Android里的ProgressBar的使用

Android入门第63天-解决同一行里ImageView或者是组件和TextView不能置顶对齐

Android入门第41天-Android中的Service(bindService)

Android入门第10天-Android访问远程Spring Boot提供的Restful API接口

Android入门第40天-Android中的Service(SimpleStartService)