当前位置:首页 > 工具 > 正文内容

Android ActionMode 核心机制解析

访客 工具 2026年6月9日 1

ActionMode 是 Android 提供的上下文操作模式实现方案,可临时接管 ActionBar 区域提供情境化功能。以下通过实例演示其基础实现:

布局文件定义主界面元素:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:id="@+id/main_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击触发模式"/>
</RelativeLayout>

OptionMenu 菜单配置:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/opt_item1" 
        android:title="操作1"
        app:showAsAction="always"/>
    <item android:id="@+id/opt_item2" 
        android:title="操作2"
        app:showAsAction="always"/>
</menu>

ActionMode 菜单配置:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/mode_item1" 
        android:title="模式操作1"/>
    <item android:id="@+id/mode_item2" 
        android:title="模式操作2"/>
</menu>

Java 逻辑实现:

public class MainActivity extends AppCompatActivity {
    private TextView mainText;

    @Override
    protected void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.activity_main);
        mainText = findViewById(R.id.main_text);
        
        mainText.setOnClickListener(v -> 
            startActionMode(new ModeHandler())
        );
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.opt_item1) {
            Toast.makeText(this, "常规操作1", LENGTH_SHORT).show();
        } else if (id == R.id.opt_item2) {
            Toast.makeText(this, "常规操作2", LENGTH_SHORT).show();
        }
        return true;
    }

    private class ModeHandler implements ActionMode.Callback {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.action_menu, menu);
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.mode_item1) {
                Toast.makeText(MainActivity.this, "模式操作1", LENGTH_SHORT).show();
            } else if (id == R.id.mode_item2) {
                Toast.makeText(MainActivity.this, "模式操作2", LENGTH_SHORT).show();
            }
            mode.finish();
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
        }
    }
}

关键生命周期方法:

  • onCreateActionMode:初始化操作菜单
  • onActionItemClicked:处理菜单项点击事件
  • onDestroyActionMode:清理操作资源

样式定制示例(styles.xml):

<item name="actionModeBackground">@drawable/custom_bg</item>
<item name="actionModeCloseDrawable">@drawable/custom_close_icon</item>
<item name="actionModeStyle">@style/CustomActionMode</item>

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。