Menu菜单

2.1系统菜单: OptionsMenu

注意:一个Activity只有一个系统菜单
步骤流程:

  1. 在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件
  2. Activity重写onCreateOptionsMenu(Menu menu) 加载资源文件
    a) 设置menu填充器: getMenuInflater().inflate(R.menu.xml , menu);
  3. Activity重写onOptionsItemSelected(MenuItem item) 加设置事件监听
    a) 获得点击的条目: int item_id = item.getItemId();
    b) switch 判断

2.2上下文菜单ContextMenu

注意:长按绑定的控件+可以为任意一个view设置上下文菜单
步骤流程:

  1. 在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件
  2. Activity重写onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 加载资源文件
    a) 设置menu填充器: getMenuInflater().inflate(R.menu.xml , menu);
  3. Activity重写onConextItemSelected(MenuItem item) 加设置事件监听
    a) 获得点击的条目: int item_id = item.getItemId();
    b) switch 判断
  4. 为控件添加长按属性 并将菜单绑定到这个控件上
    a) registerForContextMenu(textView); //为textView 注册上下文菜单

2.3弹出菜单PoupMenu

注意:弹出菜单,默认弹出的位置在控件view的下方
步骤流程:

  1. 在res下面创建一个menu文件夹,并新建一个xml文件作为PoupMenu的布局文件
  2. 把PopupMenu相关逻辑封装到showPopupMenu()方法中, 包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等
    a) 给View视图设置点击事件, 并调用showPopupMenu()方法
    b) 封装showPopupMenu()方法
    i. 创建对象
    PopupMenu popupMenu = new PopupMenu(上下文, View视图);
    ii. 利用用填充器, 填充布局
    popupMenu.inflate(R.menu.xml);
    iii. 事件监听
    popupMenu.setOnMenuItemClickListener()
    iv. 显示
    popupmenu.show();
  3. 为控件设置事件监听直接调用showPopupMenu()方法
总代码如下:
  1. 主布局 : activity_main.xml下
	<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_id"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="系统菜单演示"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</RelativeLayout>
  1. res下面创建一个menu文件夹,并新建一个xml文件: options_menu文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!--showAsAction属性: always总是; never 从不; ifRoom 能显示就显示; 默认是nerver-->
    <item
        android:id="@+id/blue"
        android:title="蓝色"
        app:showAsAction="never"></item>
    <item
        android:id="@+id/red"
        android:title="红色"></item>
    <item
        android:id="@+id/green"
        android:title="绿色"></item>

</menu>
  1. MainActivity中
package com.example.app2;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private RelativeLayout relativeLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView_id);
        relativeLayout = findViewById(R.id.layout_id);


        //    上下文菜单ContextMenu
        // 为控件添加长按属性并将菜单绑定到这个控件上
        // register: 注册;
        registerForContextMenu(textView);


        // 弹出菜单PoupMenu
        //点击事件 PopupMenu
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopupMenu();
            }
        });
    }

    /**
     * 弹出菜单设置
     */
    private void showPopupMenu() {
        // 1. 创建对象
        // 参1 上下文; 参二: 菜单显示在指定控件的下方
        PopupMenu popupMenu = new PopupMenu(this, textView);

        // 2. 记载布局 填充布局
        popupMenu.inflate(R.menu.options_menu);

        // 3. 事件监听
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int itemId = item.getItemId();
                switch (itemId) {
                    case R.id.blue:
                        // 注意: 颜色不能使用缩写 如: #00f
                        // 否则报java.lang.IllegalArgumentException: Unknown color异常
                        textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
                        break;
                    case R.id.green:
                        textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
                        break;
                    case R.id.red:
                        textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
                        break;
                    default:
                        break;
                }
                return false;
            }
        });

        // 4. 显示
        popupMenu.show();
    }


    //    系统菜单: OptionsMenu
    // 重写onCreateOptionsMenu 加载资源文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // menu 填充器
        getMenuInflater().inflate(R.menu.options_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    //    系统菜单: OptionsMenu
    // 重写onOptionsItemSelected 设置事件监听
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId) {
            case R.id.blue:
                // 注意: 颜色不能使用缩写 如: #00f
                // 否则报java.lang.IllegalArgumentException: Unknown color异常

//                textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
                relativeLayout.setBackgroundColor(Color.parseColor("#0000ff")); //设置背景颜色

                break;
            case R.id.green:
//                textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
                relativeLayout.setBackgroundColor(Color.parseColor("#00ff00")); //设置背景颜色

                break;
            case R.id.red:
//                textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
                relativeLayout.setBackgroundColor(Color.parseColor("#ff0000")); //设置背景颜色
                break;
            default:
                break;
        }

        return super.onOptionsItemSelected(item);
    }


    //    上下文菜单ContextMenu
    //2.Activity重写onCreateContextMenu加载资源文件
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.options_menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //    上下文菜单ContextMenu
    // 3.Activity重写onConextItemSelected设置事件监听
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId) {
            case R.id.blue:
                // 注意: 颜色不能使用缩写 如: #00f
                // 否则报java.lang.IllegalArgumentException: Unknown color异常
                textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
                break;
            case R.id.green:
                textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
                break;
            case R.id.red:
                textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
                break;
            default:
                break;
        }

        return super.onContextItemSelected(item);
    }
}

源于第二天Menu菜单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值