版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

本文主要将PopUpMenu和ToolbarDemo【Toolbar作为顶部导航栏的简单使用】进行搭配使用,实现toolbar的溢出菜单的另外一种展现。

效果图

代码分析

请阅读参考资料。

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

(1)将toolbar基础代码导入到项目中,参考《ToolbarDemo【Toolbar作为顶部导航栏的简单使用】》

(2)将nav_more_h.png复制到项目中

(3)在res/menu目录中添加toolbar_one_menu.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!-- 基础的toolbar(右侧只有一个图标的样式) -->
<!--app:showAsAction="ifRoom/never/always",ifRoom表示只要在app bar存在可用空间,就可以显示,never表示一直显示在溢出菜单(overflowwindow)里面 -->
<!--always:始终把这个放到项目中app bar。但是谷歌建议避免这么使用,除非它非常关键,使它始终显示在操作栏。设置多个始终显示在app bar可能会导致它们在应用栏其他UI重叠。-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_more"
android:icon="@drawable/nav_more_h"
android:title="更多"
app:showAsAction="always"/> </menu>

(4)添加popupMenu相关的图片资源的menu文件以及样式设置

1、将图片资源添加到项目中

  

2、将popup_menu.xml添加到项目中

<?xml version="1.0" encoding="utf-8"?>
<!-- 基础的toolbar的menu -->
<!--app:showAsAction="ifRoom/never/always",ifRoom表示只要在app bar存在可用空间,就可以显示,never表示一直显示在溢出菜单(overflowwindow)里面 -->
<!--always:始终把这个放到项目中app bar。但是谷歌建议避免这么使用,除非它非常关键,使它始终显示在操作栏。设置多个始终显示在app bar可能会导致它们在应用栏其他UI重叠。-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> <item
android:id="@+id/action_share"
android:icon="@drawable/nav_menu_share"
android:title="分享"
app:showAsAction="never"
/> <item
android:id="@+id/action_publish"
android:icon="@drawable/nav_menu_fabu"
android:title="发布"
app:showAsAction="never" /> </menu>

3、在styles.xml文件中添加以下代码【注意:popupMenu的文本样式使用的文本颜色和大小值跟toolbar通用】

<resources>

    <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- 添加这一句, 即可改变toolbar右侧更多图标的颜色-->
<item name="android:textColorSecondary">@color/nav_menu_text_color</item>
<!-- popupMenu的样式 -->
<item name="android:popupMenuStyle">@style/popupmenu_bg_style</item>
<item name="textAppearanceSmallPopupMenu">@style/popupmenu_text_style</item>
<item name="textAppearanceLargePopupMenu">@style/popupmenu_text_style</item>
</style> <!-- toolbar标题的颜色和大小值设置 -->
<style name="nav_toolbar_title_style">
<item name="android:textColor">@color/nav_text_color</item>
<item name="android:textSize">@dimen/nav_title_text_size</item>
</style>
<!-- toolbar的menu(非popup样式)的颜色和大小值设置 -->
<style name="nav_toolbar_menu_style">
<item name="android:actionMenuTextColor">@color/nav_menu_text_color</item>
<item name="android:textSize">@dimen/nav_menu_text_size</item>
</style> <!-- toolbar弹出的popup菜单的颜色和大小值设置 -->
<style name="nav_toolbar_popup_style">
<item name="android:colorBackground">@color/nav_popup_bg_color</item>
<item name="android:textColor">@color/nav_popup_text_color</item>
<item name="android:textSize">@dimen/nav_popup_text_size</item>
<!--将overlapAnchor属性设置成false就可以在toolbar下方显示-->
<item name="overlapAnchor">false</item>
</style> <!-- popupMenu的背景色 -->
<style name="popupmenu_bg_style" >
<item name="android:popupBackground">@drawable/popup_menu_bg</item>
</style>
<!-- popupMenu的文本样式 -->
<style name="popupmenu_text_style">
<item name="android:textColor">@color/nav_popup_text_color</item>
<item name="android:textSize">@dimen/nav_popup_text_size</item>
</style> </resources>

三、使用方法

(1)在activity布局文件中引用nav_toolbar_base.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F4F4F4"> <include layout="@layout/nav_toolbar_base"/> </LinearLayout>

(2)在Activity中写法如下

package com.why.project.popupmenudemo;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.view.menu.MenuPopupHelper;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import java.lang.reflect.Field; public class MainActivity extends AppCompatActivity { private Toolbar mToolbar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initToolBar();//初始化toolbar
} private void initToolBar() {
mToolbar = findViewById(R.id.toolbar_base);
mToolbar.setTitle("");//这样设置的话,自带的标题就不会显示
//设置自定义的标题(居中)
TextView toolBarTitle = mToolbar.findViewById(R.id.toolbarTitle);
toolBarTitle.setText("标题");
setSupportActionBar(mToolbar);//由于toolbar只是一个普通控件,我们将ToolBar设置为ActionBar
//设置导航图标要在setSupportActionBar方法之后
//mToolbar.setNavigationIcon(null);//设置为空的话,就会不显示左侧的图标
//对NavigationIcon添加点击
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
}); //添加menu 菜单点击事件
mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.action_more:
//showPopupMenu(item.getActionView());//这样写报错: java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor
showPopupMenu(findViewById(R.id.action_more));
break;
}
return true;
}
}); } @Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_one_menu, menu);//toolbar添加menu菜单
return true;
} @SuppressLint("RestrictedApi")
private void showPopupMenu(View ancherView){
//创建弹出式菜单对象(最低版本11)
PopupMenu popupMenu = new PopupMenu(this, ancherView);//第二个参数是绑定的那个view
//获取菜单填充器
MenuInflater inflater = popupMenu.getMenuInflater();
//填充菜单
inflater.inflate(R.menu.popup_menu, popupMenu.getMenu());
//使用反射,强制显示菜单图标
try {
Field field = popupMenu.getClass().getDeclaredField("mPopup");
field.setAccessible(true);
MenuPopupHelper mPopup = (MenuPopupHelper) field.get(popupMenu);
mPopup.setForceShowIcon(true);
} catch (Exception e) {
}
//绑定菜单项的点击事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_share:
Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_SHORT).show();
break; case R.id.action_publish:
Toast.makeText(MainActivity.this, "发布", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
//显示(这一行代码不要忘记了)
popupMenu.show();
}
}

混淆配置

无

参考资料

Android学习总结——Popup menu:弹出式菜单

Android:自定义PopupMenu的样式(显示图标/设置RadioButton图标)

被人鄙视了,所以来回复下【popupmenu如何让其显示图标】

Android菜鸟的成长笔记——PopupMenu使用

项目demo下载地址

https://github.com/haiyuKing/PopupMenuDemo

PopupMenuDemo【popupMenu的简单使用】的更多相关文章

  1. Android快速开发常用知识点系列目录

    项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...

  2. AndroidStudyDemo之Android4.x介绍

    Android4.x 思维导图 作者:李旺成 时间:2016年4月7日 AndroidStudyDemo 系列篇章开始了!!! AndroidStudyDemo 你值得拥有AndroidStudyDe ...

  3. 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu

    [源码下载] 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu 作者 ...

  4. 背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu

    [源码下载] 背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu 作者:webabcd 介绍背水一战 Windows 10 之 控件(弹 ...

  5. 控件(弹出类): ToolTip, Popup, PopupMenu

    示例1.ToolTip 的示例Controls/FlyoutControl/ToolTipDemo.xaml <Page x:Class="Windows10.Controls.Fly ...

  6. 【转】Android新组件Material Dialog,SwipeRefreshLayout,ListPopupWindow,PopupMenu等

    朝花夕拾----新组件的学习和使用 分类: Android UI2015-06-26 11:31 440人阅读 评论(0) 收藏 举报 uidialogMaterial   目录(?)[-] Mate ...

  7. Android menu 简单创建

    在android 中与menu相关的类有4个: Menu:菜单的父窗口,用于创建一个菜单,是subMenu,ContentMenu,MenuItem等的父接口:SubMenuyo用于创建子菜单,Con ...

  8. 弹出式菜单(下拉菜单)实现——PopupMenu

    PopupMenu代表弹出式菜单,它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方或上方.PopupMenu可增加多个菜单项,并可为菜单项增加子菜单. 使用P ...

  9. 使用PopupMenu创建弹出式菜单

    PopupMenu代表弹出式菜单,它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方或上方.PopupMenu可增加多个菜单项,并可为菜单项增加子菜单. 使用P ...

随机推荐

  1. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  2. C++11标准中常用到的各种算法汇总.

    在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据 ...

  3. bzoj 3126 单调队列优化dp

    能转移的最左是其左边完整区间的最右左端点,最右是能覆盖它的最左左端点-1 #pragma GCC optimize ("O3") #include<cstdio> #i ...

  4. bzoj 4318 OSU 概率期望dp

    可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0: 所以对于每一个位置,处理出期望的f,x和x ...

  5. 【小白学C#】谈谈C#多播委托因异常而终止的解决方案

    一.前言 前几天,马三在与朋友闲聊技术的时候,朋友忽然抛出一个问题,把马三难倒了,本着求知的精神,回来以后马三就查阅了相关资料并做了一些实验,终于把问题搞明白了,因此写下本篇博客记录一下.首先,问题是 ...

  6. Java中的异常简介

    Java中异常的分类 Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运营,但是,由于入参.程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补 ...

  7. 简述RPC原理实现

      前言 架构的改变,往往是因为业务规模的扩张. 随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展. 分布式服务 ...

  8. 在ASP.NET Core中使用EPPlus导入出Excel文件

    这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...

  9. TensorFlow从1到2(二)续讲从锅炉工到AI专家

    图片样本可视化 原文第四篇中,我们介绍了官方的入门案例MNIST,功能是识别手写的数字0-9.这是一个非常基础的TensorFlow应用,地位相当于通常语言学习的"Hello World!& ...

  10. 很详细的Django入门详解

    Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...