话说程序猿都是段子手,看到有的程序猿写文章,前面都会先写一个段子,我这么有幽默感的段子手,也决定效仿一下。

  “段子。”  

  写完段子,下面开始进入正题。

                

  今天要说的 ActionMode 是 Android 提供的一种实现菜单方式。Android 实现菜单的方式有很多种,比如 ActionBar、ToolBar、ContextMenu、OptionMenu、PopupMenu、PopupWindow 等等。ActionMode 自己之前一直没用过,最近接手一个系统 app,里面有用这个,学习了下它的实现方式。ActionMode 是临时占据了ActionBar的位置,使用起来也很简单。先看下效果图:

                

  程序一运行,有一个 TextView 显示 Hello World! ,为了作对比,我给出了一个 OptionMenu, 点击 菜单选项,弹出相应的 Toast 。 点击 Hello World,进入 ActionMode 模式,可以看到, ActionMode 临时占用了 ActionBar , 点击相应的 菜单选项,这里我也只是弹出相应的 Toast 以作演示。

  下面贴出代码,布局文件如下:

<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.joy.actionmodetest.MainActivity"> <TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

  在 res/menu 下面新建 OptionMenu 的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/op_test1" android:icon="@mipmap/ic_launcher" android:title="menu1"
app:showAsAction="always"/>
<item android:id="@+id/op_test2" android:icon="@mipmap/ic_launcher" android:title="menu2"
app:showAsAction="always"/>
</menu>

  同时还要在 res/menu 下面 新建一个xml 文件,作为 ActionMode 菜单的布局文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/am_test1" android:icon="@mipmap/remind" android:title="menu1"
app:showAsAction="always"/>
<item android:id="@+id/am_test2" android:icon="@mipmap/favorites" android:title="menu2"
app:showAsAction="always"/>
</menu>

  java 代码如下:

package com.example.joy.actionmodetest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private TextView tv_test; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_test = (TextView) findViewById(R.id.tv_test);
tv_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActionMode(new MyCallback());
}
});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.option_menu,menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.op_test1:
Toast.makeText(MainActivity.this,"option-menu1-test",Toast.LENGTH_SHORT).show();
break;
case R.id.op_test2:
Toast.makeText(MainActivity.this,"option-menu2-test",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
} private class MyCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.action_mode_menu, menu);
return true;
} @Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
} @Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.am_test1:
Toast.makeText(MainActivity.this,"warning!",Toast.LENGTH_SHORT).show();
break;
case R.id.am_test2:
Toast.makeText(MainActivity.this,"favourite!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
mode.finish();
return true;
} @Override
public void onDestroyActionMode(ActionMode mode) { }
}
}

  ActionMode 的使用非常简单,调用 Activity 的 startActionMode 方法进入 ActionMode 模式即可,在不需要使用的时候调用 ActionMode 的 finish 方法退出 ActionMode 模式。startActionMode 方法接收一个 ActionMode.Callback 的参数,使用 ActionMode 的关键在于实现这个接口中 ActionMode 在各个声明周期的回调方法:

    onCreateActionMode(ActionMode, Menu)       在初始创建的时候调用

    onPrepareActionMode(ActionMode, Menu)      在创建之后准备绘制的时候调用

    onActionItemClicked(ActionMode, Menu)       当点击 ActionMode 菜单选项的时候调用

    onDestroyActionMode(ActionMode)               当退出 ActionMode 的时候调用

  ActionMode 的 getMenuInflater 方法返回一个 MenuInflater 对象,用来加载 ActionMode 的菜单布局文件。现在这个 ActionMode 黑色背景,还带点红色底线,样式很丑,自己都快看不下去了。那么怎么设置 ActionMode 的样式呢?答案是通过 style 来设置。打开 res/values/styles.xml 文件进行修改。具体可以修改如下选项,每个选项的意义通过 name 属性也都很清楚的体现出来:

<item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
<item name="actionModeBackground">@drawable/abc_cab_background_top_material</item>
<item name="actionModeSplitBackground">?attr/colorPrimaryDark</item>
<item name="actionModeCloseDrawable">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
<item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item>
<item name="actionModeCutDrawable">@drawable/abc_ic_menu_cut_mtrl_alpha</item>
<item name="actionModeCopyDrawable">@drawable/abc_ic_menu_copy_mtrl_am_alpha</item>
<item name="actionModePasteDrawable">@drawable/abc_ic_menu_paste_mtrl_am_alpha</item>
<item name="actionModeSelectAllDrawable">@drawable/abc_ic_menu_selectall_mtrl_alpha</item>
<item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_mtrl_alpha</item>

  好了。ActionMode 就记这么一点,不能更多了...

  

ActionMode 就记这么一点,不能更多了的更多相关文章

  1. 看的oracle数据库视频 记的一点笔记

    3个默认的用户    sys          //网络管理员  权限由上到下降低 [最后加上 as sysdba]    system  //本地管理员    scott     //普通用户  默 ...

  2. 随意记的一点 js 笔记

    1. 给未经声明的变量赋值在严格模式下会导致抛出 ReferenceError 错误(意思是,所有变量都必须用 var 去定义,不能在函数内部定义全局变量): 2. 在严格模式下,不能定义名为 eva ...

  3. [操作系统实验lab3]实验报告

    [感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...

  4. Android最佳性能实践(一)——合理管理内存

    有不少朋友都问过我,怎样才能写出高性能的应用程序,如何避免程序出现OOM,或者当程序内存占用过高的时候该怎么样去排查.确实,一个优秀的应用程序,不仅仅要功能完成得好,性能问题也应该处理得恰到好处.为此 ...

  5. C Primer Plus(第五版)6

    第 6 章 C 控制语句 : 循环 在本章中你将学习下列内容 已经多次学过,没怎么标注 · 关键字: for while do while · 运算符: < > >= <= ! ...

  6. 成为Java GC专家(3)—如何优化Java垃圾回收机制

    为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...

  7. Web动效研究与实践

    随着CSS3和HTML5的发展,越来越多狂拽炫酷叼炸天的动效在网页设计上遍地开花,根据最新的浏览器市场份额报告,IE6的份额已经降到了5.21%,这简直是一个喜大普奔的消息,做动效可以完全不care低 ...

  8. Opencv怎么读入,显示,保存图像-OpenCV步步精深

    怎么读入图像呢? 我们用 img = cv2.imread('图像路径\原图像名称',0) 原图像名称要有后缀 .png , .jpg等等原图像带有的后缀. 这里我们着重说明一下图像路径,这个路径一定 ...

  9. ZeroMQ 教程 001 : 基本概览

    介绍性的话我这里就不翻译了, 总结起来就是zmq很cool, 你应该尝试一下. 如何安装与使用zmq 在Linux和Mac OS上, 请通过随机附带的包管理软件, 或者home brew安装zmq. ...

随机推荐

  1. iOS查错机制

    转自: http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=404478233&idx=2&sn=ae55d4f70fce ...

  2. keystone policy.json 的学习总结

    keystone的policy.json文件位于:/etc/keystone/policy.json 其内容如下: 1 { 2 "admin_required": "ro ...

  3. java中关于编码的问题(字符转换流及字符缓冲流 )

    上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流.使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式. OutputS ...

  4. 滚动时div的背景图片随之滚动

    在浏览一些网站时发现有一种效果是当滚动时看到某一DIV的背景也会随之滚动,如下: 当滚动时内容位置保持不变,但是内容后面的背景却在随着滚动.随之我通过审查元素看到了其是通过background-pos ...

  5. Photoshop 画基本图形

    作者:zccst 1,画三角形 按下“U”选择“多边形工具”(是个六边形的图标),在上方的菜单栏中的“边”后面输入“3”,然后在画布中拖动就是三角形了,画好后按下CTRL+ENTER键转化成选区,然后 ...

  6. bzoj4008: [HNOI2015]亚瑟王【期望dp】

    一个特别神奇的dp,特别厉害. f(i, j) 表示 有 j 轮发动技能的牌在 [1, i] 另外的m - j轮在[i + 1, n]之间的概率. 怎么转移呢? 首先考虑i这张牌不选的情况,f(i - ...

  7. The account '...' is no team with ID '...'

    iOS升到9.2之后,有一个大坑,原先真机调试的开发者账号(未付费),连不了Xcode了,会弹出一个提示框提示你, The account '...' is no team with ID '...' ...

  8. API WAVE 专栏

    关于音频输入.输出设备的使用 源:API WAVE 专栏

  9. myeclipse的常用快捷键

    创建一个类 Alt+Shift+N,C,输入Demo,回车 创建类属性 按3次下方向键,回车,输入String name;,回车 创建构造器 Alt+Shift+S,O,回车 创建getter/set ...

  10. Mysql和Oracle的一些语法区别

    作为一个有追求的程序猿,当然要不断的学习,巴拉巴拉巴拉...好了,贴一个网址给大家,哈哈 MySQL与Oracle 差异比较:http://www.cnblogs.com/HondaHsu/p/364 ...