Android学习笔记十九之Menu菜单

Android学习笔记十九之Menu菜单

  之前我们已经学习过Android的基本UI控件和Android的五大布局LinearLayout线性布局、RelativeLayout相对布局、FrameLayout帧布局、GridLayout网格布局和TableLayout表格布局,下面我们来学习Android的其他控件,这些控件能让我们的APP更加友好和人性化。

  今天我们来学习第一个友好交互控件,Menu菜单。在AndroidOS中,Menu菜单有三种,分别是:OptionMenu(选项菜单)、ContextMenu(上下文菜单)和SubMenu(子菜单)。下面我们分别来介绍一下它们。

OptionMenu选项菜单

  OptionMenu是Android中最常见的菜单,通过手机上的Menu键可以唤出。使用方法非常简单,只需要重写onCreateOptionsMenu(Menu menu)和 onOptionsItemSelected(MenuItem item)这两个方法即可,前者是OptionMenu创建的时候调用,完成初始化,只调用一次;后者是菜单项被选中是触发的事件,在这里完成Menu选项事件处理。除了这两个方法之外,我们还可以重写OptionMenu的以下三个方法:onOptionsMenuClosed(Menu menu)菜单关闭时候回调方法、onPrepareOptionsMenu(Menu menu)菜单显示前回调方法、 onMenuOpened(int featureId, Menu menu)菜单打开之后回调方法。

下面我们通过一个例子说明:

Activity代码:

package com.example.menudemo;

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.widget.TextView;

/**
 * Created by Devin on 2016/7/4.
 */
public class OptionMenuActivity extends AppCompatActivity {

private final static int BASKETBALL = 10001;
private final static int FOOTBALL = 10002;
private final static int VOLLEYBALL = 10003;
private final static int BALLOON = 10004;
private final static int PINGPONG = 10005;
private final static int BASEBALL = 10006;
private TextView tv_option_menu;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_optionmenu);
    tv_option_menu = (TextView) findViewById(R.id.tv_option_menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //int groupId, int itemId, int order, CharSequence title
    menu.add(1, BASKETBALL, 2, "篮球");
    menu.add(1, FOOTBALL, 3, "足球");
    menu.add(1, VOLLEYBALL, 4, "排球");
    menu.add(1, BALLOON, 5, "气球");
    menu.add(1, PINGPONG, 6, "乒乓球");
    menu.add(1, BASEBALL, 7, "棒球");
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case BASKETBALL:
            tv_option_menu.setText("你喜欢篮球吗?");
            break;
        case FOOTBALL:
            tv_option_menu.setText("你喜欢足球吗?");
            break;
        case VOLLEYBALL:
            tv_option_menu.setText("你喜欢排球吗?");
            break;
        case BALLOON:
            tv_option_menu.setText("你喜欢气球吗?");
            break;
        case PINGPONG:
            tv_option_menu.setText("你喜欢乒乓球吗?");
            break;
        case BASEBALL:
            tv_option_menu.setText("你喜欢棒球吗?");
            break;
    }
    return super.onOptionsItemSelected(item);
}
}

实现效果图:

Android学习笔记十九之Menu菜单_第1张图片

这里实现比较简单,就不在做很多的介绍了。添加菜单有两种方法,可以通过定义XML文件,然后调用getMenuInflater().inflate(R.menu.menu_main, menu)加载,也可以像上面例子一样通过代码添加,即是add的方法。

ContextMenu上下文菜单

  当我们长时间按住一个View组件的时候,会弹出一个菜单,那个菜单就是ContextMenu。使用ContextMenu需要经历如下三个步骤:第一步是重写onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo)方法,第二步是为view组件注册上下文菜单,即是调用 registerForContextMenu(View) 方法,第三步是给菜单项指定事件监听器,即是重写onContextItemSelected(MenuItem item)方法,下面我们用一个例子说明一下:

  上面我们已经实现了用代码加载菜单项,现在我们采用XML文件来加载菜单项,这样修改的时候只需要修改XML文件即可,也减轻了JAVA代码的臃肿。

Activity代码:

package com.example.menudemo;

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.Button;
import android.widget.Toast;

/**
 * Created by Devin on 2016/7/4.
 */
public class ContextMenuActivity extends AppCompatActivity {
private Button btn_show_context_menu;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contextmenu);
    btn_show_context_menu = (Button) findViewById(R.id.btn_show_context_menu);
    registerForContextMenu(btn_show_context_menu);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater menuInflater = new MenuInflater(this);
    menuInflater.inflate(R.menu.context_menu, menu);
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.basketball:
            Toast.makeText(getApplicationContext(), "你选择了篮球", Toast.LENGTH_SHORT).show();
            break;
        case R.id.football:
            Toast.makeText(getApplicationContext(), "你选择了足球", Toast.LENGTH_SHORT).show();
            break;
        case R.id.baseball:
            Toast.makeText(getApplicationContext(), "你选择了棒球", Toast.LENGTH_SHORT).show();
            break;
        case R.id.pingpang:
            Toast.makeText(getApplicationContext(), "你选择了乒乓球", Toast.LENGTH_SHORT).show();
            break;
        case R.id.balloon:
            Toast.makeText(getApplicationContext(), "你选择了汽球", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onContextItemSelected(item);
}
}

menu中XML代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
    android:id="@+id/context_menu_item"
    android:checkableBehavior="none">

    <item
        android:id="@+id/basketball"
        android:title="篮球" />
    <item
        android:id="@+id/football"
        android:title="足球" />
    <item
        android:id="@+id/baseball"
        android:title="棒球" />
    <item
        android:id="@+id/pingpang"
        android:title="乒乓球" />
    <item
        android:id="@+id/balloon"
        android:title="汽球" />

</group>
</menu>

实现的效果图:

Android学习笔记十九之Menu菜单_第2张图片

布局文件比较简单,就不在贴出代码了。其中,需要在res目录下新建一个文件夹menu。

  子菜单相当于在菜单的item中又嵌套一层菜单。就不多介绍了,下面我们直接实现一个例子:

Activity代码:

package com.example.menudemo;

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.Button;
import android.widget.TextView;

/**
 * Created by Devin on 2016/7/4.
 */
public class SubMenuActivity extends AppCompatActivity {
private Button btn_show_sub_menu;
private TextView tv_show_sub;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_submenu);
    btn_show_sub_menu = (Button) findViewById(R.id.btn_show_sub_menu);
    registerForContextMenu(btn_show_sub_menu);
    tv_show_sub = (TextView) findViewById(R.id.tv_show_sub);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    MenuInflater menuInflater = new MenuInflater(this);
    menuInflater.inflate(R.menu.sub_menu, menu);
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.app:
            tv_show_sub.setText("你选择的是水果类的苹果");
            break;
        case R.id.pear:
            tv_show_sub.setText("你选择的是水果类的雪梨");
            break;
        case R.id.grape:
            tv_show_sub.setText("你选择的是水果类的葡萄");
            break;
        case R.id.sub_basketball:
            tv_show_sub.setText("你选择的是球类的篮球");
            break;
        case R.id.sub_football:
            tv_show_sub.setText("你选择的是球类的足球");
            break;
        case R.id.sub_balloon:
            tv_show_sub.setText("你选择的是球类的汽球");
            break;
        case R.id.java:
            tv_show_sub.setText("你选择的是语言类的Java");
            break;
        case R.id.Swift:
            tv_show_sub.setText("你选择的是语言类的swift");
            break;
        case R.id.php:
            tv_show_sub.setText("你选择的是语言类的PHP");
            break;
    }
    return super.onContextItemSelected(item);
}
}

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/fruit"
        android:title="水果">
        <menu>
            <group android:checkableBehavior="none">
                <item
                    android:id="@+id/app"
                    android:title="苹果" />
                <item
                    android:id="@+id/pear"
                    android:title="雪梨" />
                <item
                    android:id="@+id/grape"
                    android:title="葡萄" />
            </group>
        </menu>
    </item>
    <item
        android:id="@+id/ball"
        android:title="球类">
        <menu>
            <group android:checkableBehavior="none">
                <item
                    android:id="@+id/sub_basketball"
                    android:title="篮球" />
                <item
                    android:id="@+id/sub_football"
                    android:title="足球" />
                <item
                    android:id="@+id/sub_balloon"
                    android:title="气球" />
            </group>
        </menu>
    </item>
    <item
        android:id="@+id/language"
        android:title="语言">
        <menu>
            <group android:checkableBehavior="none">
                <item
                    android:id="@+id/java"
                    android:title="JAVA" />
                <item
                    android:id="@+id/Swift"
                    android:title="Swift" />
                <item
                    android:id="@+id/php"
                    android:title="PHP" />
            </group>
        </menu>

    </item>
</group>
</menu>

实现的效果图:

Android学习笔记十九之Menu菜单_第3张图片

这里实现的是非常简单的,更加复杂就按需要实现。

最后还介绍一个PopupMenu(弹出式菜单),直接实现一个小例子

java代码:

btn_popup_menu = (Button) findViewById(R.id.btn_popup_menu);
    btn_popup_menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            PopupMenu popupMenu = new PopupMenu(MainActivity.this, btn_option_menu);
            popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.popup_java:
                            Toast.makeText(MainActivity.this, "你选择了JAVA语言", Toast.LENGTH_SHORT).show();
                            break;
                        case R.id.popup_Swift:
                            Toast.makeText(MainActivity.this, "你选择了Swift语言", Toast.LENGTH_SHORT).show();
                            break;
                        case R.id.popup_php:
                            Toast.makeText(MainActivity.this, "你选择了PHP语言", Toast.LENGTH_SHORT).show();
                            break;
                    }
                    return true;
                }
            });
            popupMenu.show();
        }
    });

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/popup_java"
        android:title="JAVA" />
    <item
        android:id="@+id/popup_Swift"
        android:title="Swift" />
    <item
        android:id="@+id/popup_php"
        android:title="PHP" />
</group>
</menu>

实现的效果图:

  到这里就基本介绍完了Menu的基本知识,我们可以使用menu实现很多的功能。
点击下载源码,最后照例附上国内镜像API

你可能感兴趣的:(android,UI,布局,控件,菜单-Menu)