Android 复制粘贴对话框弹出监听实现

安卓开发实战:深入解析复制粘贴功能原理与高级应用 在移动应用开发中,系统剪贴板是实现数据交换和内容共享的核心机制之一。其工作原理基于操作系统提供的剪贴板服务,通过标准化的数据封装和跨进程通信协议,允许不同应用间安全、高效地传递信息。这项技术的核心价值在于简化用户操作流程,提升内容迁移和编辑的效率,广泛应用于笔记、社交、办公等需要文本处理和数据交换的场景。在安卓平台上,剪贴板框架围绕 ClipboardManager 和 ClipData 等关键类构建,支持从纯文本到复杂文件 URI 的多种数据格式。随着系统版本迭代,安卓在剪贴板访问权限和数据安全方面不断加 阅读详情

长按文本框或者webview界面,会弹出复制粘贴剪切等对话框,但是目前好多厂商都是自己写的控件,先说一下对系统的对话框进行监听的情况。


这里是为了监听对话框来对自定义view进行高度的处理,对华为三星等手机做个适配,自定义了一个view,在onLayout方法中根据自定义的view在屏幕中的位置变化来进行判断复制粘贴对话框的弹出和隐藏。代码:

@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		super.onLayout(changed, left, top, right, bottom);
		int[] a = new int[2];

		getLocationInWindow(a);
		int currentY = a[1];
		if (android.os.Build.VERSION.SDK_INT > 18) {
			int height = getHeight();
			// TODO 大于0可能会有问题
			if (currentY > 0 && height != 0) {
				post(new Runnable() {
					@Override
					public void run() {
						ViewGroup.LayoutParams params = getLayoutParams();
						params.height = 0;
						setLayoutParams(params);
					}
				});
			} else if(currentY == 0 && height == 0){
				post(new Runnable() {
					@Override
					public void run() {
						ViewGroup.LayoutParams params = getLayoutParams();
						params.height = AppEnv.STATUS_BAR_HEIGHT;
						setLayoutParams(params);
					}
				});
			}
		}
	}

第二种方法,是在activity中进行复制粘贴对话框的弹出和隐藏的回调方法,此方法我本人还未层进行实践,核心代码贴上来日后再做个demo

public void onActionModeStarted(ActionMode mode) {
System.out.println("----------onActionModeStarted----------");
};

@Override
public void onActionModeFinished(ActionMode mode) {
System.out.println("----------onActionModeFinished----------");
super.onActionModeFinished(mode);
}


然后就是自定义的实现了,自己写了个小demo,以及文本框和webview自由选择复制这一块有点复杂,还未实现,贴一下自己的demo。

xml就是一个EditText,不贴了,

弹框的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="wrap_content"
    android:padding="10dp"
    android:background="@android:color/holo_red_light"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/copy"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:text="复制"/>
    <TextView
        android:id="@+id/paste"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:text="粘贴"/>
    <TextView
        android:id="@+id/cut"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:text="剪切"/>
    <TextView
        android:id="@+id/select_all"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:text="全选"/>
    <TextView
        android:id="@+id/select"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:text="选择"/>
</LinearLayout>



下面是代码:

package soft.sxlc.com.showhidesoftkey;

import android.content.Context;
import android.content.ClipboardManager;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.util.TimeUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.Toast;

import java.util.Collections;

public class MainActivity extends AppCompatActivity {

    private EditText et;

    private PopupWindow popupWindow;
    private View view;
    private TextView copy;
    private TextView selectAll;
    private TextView cut;
    private TextView paste;
    private TextView select;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et = (EditText) findViewById(R.id.et);
        initListener();
    }

    //TODO  初始化长按点击监听
    private void initListener() {
        et.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(!TextUtils.isEmpty(et.getText().toString())){
                    Toast.makeText(MainActivity.this, "long click", Toast.LENGTH_SHORT).show();
                    showPopWindow();
                }
                return true;
            }
        });
    }

    private void showPopWindow() {
        if (popupWindow == null) {
            LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.view_clipboard_popu, null);
            final ClipboardManager clip = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);

            //TODO 设置点击监听实现相应的处理。
            copy = (TextView) view.findViewById(R.id.copy);
            selectAll = (TextView) view.findViewById(R.id.select_all);
            cut = (TextView) view.findViewById(R.id.cut);
            paste = (TextView) view.findViewById(R.id.paste);
            select = (TextView) view.findViewById(R.id.select);

            //TODO 复制点击事件
            copy.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "已复制到粘贴板", Toast.LENGTH_SHORT).show();
                    clip.setText(et.getText().toString());
                    popupWindow.dismiss();
                }
            });

            //TODO 粘贴点击事件
            paste.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "粘贴好了", Toast.LENGTH_SHORT).show();
                    int index = et.getSelectionStart();
                    Editable editable = et.getText();
                    editable.insert(index, clip.getText().toString());
                    //et.setText(clip.getText());
                    popupWindow.dismiss();
                }
            });
            //TODO 剪切点击事件
            cut.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "我剪", Toast.LENGTH_SHORT).show();
                    clip.setText(et.getText().toString());
                    et.setText("");
                    popupWindow.dismiss();
                }
            });
            //TODO 全选点击事件
            selectAll.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "全部选中", Toast.LENGTH_SHORT).show();
                    et.selectAll();
                }
            });
            //TODO 自由选择的点击事件
            select.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "选择", Toast.LENGTH_SHORT).show();

                }
            });

            popupWindow = new PopupWindow(view, 500, 80);
        }

        //TODO 弹框的一些设置   位置  点击事件等
        popupWindow.setFocusable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.showAtLocation(et,0,20,300);
    }
}

自由选择这块以后再研究了。。。。。。。。。。。。。。。。。。。。。。。。。。





EditText是如何实现长按弹出复制粘贴等ContextMenu的源码解析 最近在做一些关于EditText编辑功能的需求,遇到了很多的问题,比如EditText在RecyclerView中会出现内容错乱、RecyclerView复用EditText后长按无法弹出复制、粘贴、全选ContextMenu等一些问题,在网上也没有搜到比较好的解决方法,于是就想研究一下这方面的源码,希望能帮到有需要的同学,少走一些弯路。 网上看到的关于EditText的ContextMenude 阅读详情

相关推荐

AnLink多屏协同工具:打破品牌壁垒,实现安卓与Windows无缝连接

多屏协同技术通过无线连接与屏幕镜像,实现了跨设备的数据流转与操作统一,其核心价值在于提升工作效率与打破数据孤岛。这项技术基于成熟的ADB调试桥与Scrcpy屏幕镜像协议,构建了低延迟、高兼容性的连接通道,广泛应用于移动办公、应用开发调试与跨设备文件管理等场景。本文以AnLink为例,深入解析其如何整合开源方案与自研中间件,解决品牌生态割裂的痛点,并通过优化编解码与连接策略,为开发者与普通用户提供稳定高效的键鼠操控与文件传输体验。

weixin_34277853的博客 491

android 复制粘贴监听

android 复制粘贴剪切功能监听,键盘快速粘贴监听。

文韬武略的专栏 2732

Shizuku:安卓系统权限管理的创新方案与开发实践

在安卓开发中,系统权限管理一直是核心挑战之一,它直接关系到应用的功能实现与设备安全。传统的Root方案虽然功能强大,但会彻底破坏系统的安全沙箱机制,带来显著风险。Shizuku作为一种创新的权限代理方案,其原理是通过ADB调试接口或有限Root权限,创建一个常驻的高权限服务进程,为普通应用提供标准化的API调用通道。这一设计在技术价值上实现了安全与功能的平衡,允许开发者在无需完整Root的情况下,高效地进行需要系统级权限的调试与功能开发,例如管理后台进程、读取系统日志等。其应用场景广泛覆盖了开发效率提升、自

weixin_33726313的博客 374

Android手机输入法按键监听-dispatchKeyEvent

最近在项目开发中遇到一个关于手机输入键盘的坑,特来记录下。

mackkill的专栏 9371

Android长按复制功能实现与优化:TextView、EditText、WebView全解析

文本复制是移动应用开发中的基础交互功能,其核心原理是通过系统剪贴板实现数据共享。在Android平台上,这一功能涉及ClipboardManager、Selection和ActionMode等关键API的协同工作。从技术价值看,良好的复制体验能显著提升用户操作效率,尤其在代码分享、链接复制等高频场景中至关重要。实际应用中,开发者需针对TextView、EditText和WebView三大核心组件分别处理,其中WebView的复制问题尤为常见,常因网页禁用选择导致用户无法复制网址或代码片段。本文聚焦Andro

weixin_34122810的博客 446

微信消息防撤回终极指南:5种方法实现本地化信息备份与管理

在即时通讯领域,消息的可靠传递与持久化存储是保障沟通效率与信息追溯的基础。其核心原理在于,当消息从发送端发出后,接收端设备会生成一份本地副本,而常见的撤回功能通常仅作用于会话层面的显示逻辑。从技术价值看,建立本地化信息管理机制,不仅能应对消息撤回带来的信息缺失,更是数据备份、合规存档与知识管理的重要实践。在应用场景上,尤其适用于工作交接、重要通知留存、项目沟通追溯等对信息完整性要求高的场合。本文聚焦于微信生态,针对这一普遍痛点,系统性地介绍了从利用系统通知历史、微信官方备份,到借助屏幕录制、自动化工具乃至规

weixin_33766168的博客 446

通过java 监听 anroid back键

1,包含头文件 import android.util.Log; import android.view.KeyEvent; 2,    // 重写方法     public boolean dispatchKeyEvent(KeyEvent event) {     // TODO Auto-generated method stub     if (event

z1067832450_的专栏 369

Mac系统安装配置ADB全攻略:从Homebrew到实战命令详解

Android Debug Bridge(ADB)是谷歌官方提供的核心命令行工具,它构建了计算机与Android设备之间的调试桥梁。其工作原理基于客户端-服务器架构,通过USB或网络协议实现通信,为开发者提供了底层设备访问能力。在技术价值上,ADB极大简化了应用调试、系统测试和自动化操作流程,是Android开发、自动化脚本编写和移动设备管理的基石工具。典型的应用场景包括应用安装卸载、日志抓取、屏幕录制、文件传输以及自动化测试等。本文聚焦于Mac平台,详细解析通过Homebrew包管理器安装配置ADB的最佳

weixin_30540691的博客 370

Android长按复制功能深度解析:从TextView到WebView的完整实现方案

文本复制是移动应用开发中的基础交互功能,其核心原理涉及Android系统的触摸事件传递、文本选择控制器与剪贴板服务的协同工作机制。在技术实现层面,开发者需要掌握TextView、EditText和WebView等不同控件的选择行为差异,理解ActionMode回调与ClipboardManager的系统集成方式。从工程实践角度,合理处理富文本复制、WebView内嵌网页的选择控制以及RecyclerView等列表场景下的性能优化,能够显著提升应用的整体交互体验。特别是在混合开发场景中,针对WebView的长

weixin_33895516的博客 492

Android11编译进阶:默认MTP模式+自动授权USB调试的深度配置

本文深入探讨了Android 11系统定制开发中实现“开箱即用”USB连接的完整方案。通过修改系统源码,强制USB连接默认为MTP模式,并自动开启与授权USB调试,从而在批量生产或特定商用场景下,省去手动确认步骤,极大提升设备连接与调试效率。

weixin_29239661的博客 306

Android WebView自定义长按选择实现收藏/分享选中文本功能

主要介绍了Android WebView自定义长按选择实现收藏/分享选中文本功能,需要的朋友可以参考下

AndroidR设备USB连接模式修改实战:如何让MTP成为默认选项(附OTG设备监听处理)

本文深入解析了在Android R系统中修改USB默认连接模式的实战方案。通过分析UsbDeviceManager核心机制,详细介绍了如何修改系统属性与源码,使设备连接电脑时默认启用MTP模式,并探讨了OTG设备监听与事件处理的完整实现路径,为系统定制开发者提供了一套可靠的工程化解决方案。

moon9的博客 281

Matlab双目相机标定

1 概述 现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,最远可以测至50m,因此有一定的心得体会想给大家分享一下。本文主要介绍双目相机标定的整个过程,以及导出标定数据的方法。 相机标定主要分为手动标定和自动标定,手动标定比较繁琐,这里主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。具体的相关标定细节也可以参照这篇博客:m

weixin_46133643的博客 2万+

Android 自定义DialogFragment替代popupwindow

谷歌建议使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且DialogFragment也允许开发者把AlertDialog作为内嵌的组件进行重用,类似Fragment(DialogFragment可以在大屏幕和小屏幕显示出不同的效果,屏幕旋转相关数据不会被销毁)解决无法复制粘贴 1:普通自定义 2:推荐自定义 popupmenu 使用DialogFragment替代PopupWindow可以解决编辑框不能复制

seven的博客 7645

CCS配置MSPM0G3507(七) 编码器(TIMER-QEI)

1.选择时钟源 BUSCLK2.时钟分频配置为1分频3.分频系数配置为14.若勾选 Start ,则生成程序后会自动开启定时器的计数,否则需手动在程序中开启5.Load Value 设置为65535。

kaneki_lh的博客 1万+

HC32F460 SPI DMA 实现高效TFT屏幕刷新的实战解析

本文针对HC32F460 MCU驱动TFT屏幕时刷新卡顿的问题,深入解析了SPI DMA技术的实战应用。通过对比传统查询模式与DMA模式的性能数据,详细阐述了如何配置SPI与DMA资源、构建核心驱动框架,并提供了避坑指南与进阶优化思路,最终实现高效、流畅的屏幕刷新,显著降低CPU占用率。

weixin_29163797的博客 151

Gemini安卓版为何没有官方APK下载?深度解析Play Integrity校验机制

Gemini并非传统独立APP,而是依托谷歌云服务与设备端协同的AI服务架构。其核心原理在于服务端大模型推理+本地轻量界面+Play Integrity动态设备校验,技术价值体现在安全可控、隐私合规与跨端一致。典型应用场景包括语音交互、图像理解、代码生成等,但所有功能均以设备完整性认证为前提。当用户搜索‘Gemini安卓APK官方下载’时,实际面临的是系统级准入限制而非分发缺失——关键卡点正是Play Integrity API的三重验证(设备可信性、账户资格、区域策略),这也解释了为何手动安装APK普遍遭

weixin_33720078的博客 3811

自定义Dialog以及按钮事件监听

先来一张图吧,很简单,只有一个Activity,当点击Button的时候就弹出这个自定义的Dialog 里面的几张图都比较丑,我不多会美工,随便用powerpoint画了几张图,原理是一样的,先不计较这些。下面正入正题 为了照顾到所有的码农,在些把所有的代码都贴出来 新建工程在此就不贴出来了,只是为了方便大家的复制粘贴,取包名为com.and.mydialog,主Acti

冰冰酱 759

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 601

AI Agent Harness自动化漏洞扫描

本文要介绍的AI Agent Harness自动化漏洞扫描方案,正是为了解决传统漏扫的上述痛点而生。漏洞检出率提升35%以上,逻辑漏洞检出率从不足30%提升到92%误报率从27%降到3%以下,人工复核成本降低90%支持自定义业务系统、IoT、工控等多场景资产扫描,适配成本降低80%内置反馈学习机制,扫描效果越用越好AI Agent是指具备自主感知、决策、行动能力的大模型驱动程序,它可以根据给定的目标,自主调用工具、规划步骤、完成任务。

AI 原生应用开发的博客 473

scrcpy Android 投屏教程:免费把手机镜像到电脑并实时控制

scrcpy 是一款免费开源(Apache 2.0 协议)的 Android 投屏工具:它把连接在电脑上的安卓设备屏幕和声音实时镜像到桌面窗口,让你直接用键盘和鼠标操作手机。它不需要 Root,不需要在手机里安装任何应用,数据只在本地传输,支持 Windows、macOS 和 Linux 三大桌面系统,镜像延迟约 35~70ms,首帧画面大约 1 秒即可出现。如果你不想为"手机投到电脑"这件事付费

gitblog_01127的博客 351

机器人轨迹规划——梯形速度轨迹(超详细)

机器人轨迹 这一系列轨迹教程将主要包括以下内容: 点到点轨迹(P2P) 五次多项式插值轨迹 三次多项式插值轨迹 梯形速度曲线轨迹 双S形速度曲线轨迹 多个自由度轨迹的时间同步 在线轨迹规划 多项式在线轨迹规划 梯形在线轨迹规划 双S形在线轨迹规划 非线性实时轨迹滤波 多点轨迹(Multi-point) 三次样条曲线(cubic spline) 贝赛尔曲线(Bezier Curve) B样条曲线(BSpline) 时间最优轨迹 三次样条时间最优轨迹 任意路径下的时间最优轨迹 时间

出门搔白首,若负平生志 1万+

安卓4电视没有输入法怎么办?三种自救方案详解

输入法是智能电视与电视盒子上最基础也最容易被忽视的系统服务。很多老设备运行着Android 4.x系统,在安装新版输入法时频繁遭遇“解析包错误”或“版本不兼容”,这是因为现代输入法的minSdk与ABI门槛已经远远超出了老系统的支持范围。理解Android输入法框架(IME)的注册机制和系统兼容性原理,是解决此类问题的关键。通过技术手段,我们可以绕过应用商店的版本限制,采用安装兼容旧版输入法、使用ADB远程注入文本或外接物理键盘等思路,恢复设备的基本交互能力。这些方法不仅适用于输入法问题,也为处理老旧And

weixin_34060741的博客 307

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2501

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: android开发基础之-----------自定义toast
下一篇: android activity知识总结
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值