android 复制、剪切、粘贴

本文介绍了在不同Android API级别下实现复制和粘贴功能的方法,包括使用ClipboardManager进行文本复制和粘贴的具体实现。

网上有很多复制粘贴的文章,只是放到自己的程序中不知道如何处理,现在寻得一可行方法如下:

Android的剪切板(ClipboardManager

注意:导包的时候

API 11之前: android.text.ClipboardManager
API 11之后: android.content.ClipboardManager

/**
    * 实现文本复制功能
    * @param content
    */
public static void copy(String content, Context context) {
// 得到剪贴板管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(content.trim());
}

/**
* 实现粘贴功能

* @param context
* @return
*/
public static String paste(Context context) {
// 得到剪贴板管理器
ClipboardManager cmb = (ClipboardManager) context
.getSystemService(Context.CLIPBOARD_SERVICE);
return cmb.getText().toString().trim();
}




网上很多文章都是这么写的:

第一种:

private void emulateShiftHeld(KeyEvent.Callback view) {
try{
KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0);
shiftPressEvent.dispatch(view);
  } catch (Exception e) {
 
  }
    }

第二种:

android2.1之后版本

其一:(已运行成功)

ClipboardManager clip = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
clip.getText(); // 粘贴
clip.setText(str); // 复制

其二:

ClipboardManager c= (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
c.setText(smsContent.getText());设置Clipboard 的内容
c.getText(smsContent.getText());提取clipboard的内容


android2.1之前版本

IClipboard clip = IClipboard.Stub.asInterface(ServiceManager.getService("clipboard"));

clip.getClipboardText().toString();//获得复制的内容

clip.setClipboardText(text);//设置Clipboard 的内容

 

来源:http://blog.youkuaiyun.com/wwzqj/article/details/8204446

<think> 我们需要禁用EditText的复制粘贴剪切功能。这可以通过禁用长按弹出的上下文菜单(context menu)以及屏蔽某些键盘操作来实现。 以下是几种方法: 1. 设置EditText的longClickable属性为false,这样长按时不会弹出上下文菜单。 2. 通过重写EditText的onTextContextMenuItem方法,拦截并禁用复制粘贴等操作。 3. 禁用光标操作(因为复制粘贴通常需要光标操作,但完全禁用光标可能会影响输入,所以需要权衡)。 但是注意:完全禁用复制粘贴可能会影响用户体验,请谨慎使用。 以下是一个自定义EditText的实现,它禁用了复制粘贴剪切功能: </think> ### Android 禁用 EditText 复制粘贴功能的完整解决方案 在 Android 应用中,有时需要禁用 EditText 的复制粘贴功能,常见于安全敏感输入(如密码)或需要限制用户操作的场景。以下是详细的实现方法: #### 方法一:完全禁用上下文菜单(推荐) ```kotlin class NoPasteEditText(context: Context, attrs: AttributeSet) : AppCompatEditText(context, attrs) { // 禁用长按菜单 override fun isSuggestionsEnabled(): Boolean = false // 禁用文本选择 override fun getSelectionStart(): Int = -1 override fun getSelectionEnd(): Int = -1 // 禁用文本选择菜单 override fun onTextContextMenuItem(id: Int): Boolean { when (id) { android.R.id.cut, android.R.id.copy, android.R.id.paste, android.R.id.pasteAsPlainText, android.R.id.shareText -> { // 拦截复制粘贴相关操作 return false } } return super.onTextContextMenuItem(id) } // 禁用文本选择 override fun setTextIsSelectable(selectable: Boolean) { super.setTextIsSelectable(false) } // 禁用长按事件 override fun performLongClick(): Boolean = false } ``` 在布局文件中使用: ```xml <com.yourpackage.NoPasteEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="禁用复制粘贴的输入框" android:inputType="textPassword"/> ``` #### 方法二:通过 XML 属性禁用 在布局文件中直接设置属性: ```xml <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:longClickable="false" android:textIsSelectable="false" android:focusableInTouchMode="true" android:cursorVisible="false" android:inputType="textNoSuggestions|textVisiblePassword"/> ``` 在代码中进一步强化: ```kotlin val editText = findViewById<EditText>(R.id.editText) // 禁用文本选择 editText.isTextSelectable = false // 禁用长按菜单 editText.setOnLongClickListener { true } // 禁用系统粘贴菜单 editText.customSelectionActionModeCallback = object : ActionMode.Callback { override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean = false override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean = false override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean = false override fun onDestroyActionMode(mode: ActionMode?) {} } ``` #### 方法三:完全禁用所有编辑功能 ```kotlin class ReadOnlyEditText(context: Context, attrs: AttributeSet) : AppCompatEditText(context, attrs) { init { // 禁用所有焦点和触摸事件 isFocusable = false isFocusableInTouchMode = false isClickable = false isLongClickable = false setTextIsSelectable(false) // 设置透明背景选择器 highlightColor = Color.TRANSPARENT } // 拦截所有触摸事件 override fun onTouchEvent(event: MotionEvent?): Boolean = false } ``` #### 方法四:高级安全输入框(带复制粘贴监控) ```kotlin class SecureEditText(context: Context, attrs: AttributeSet) : AppCompatEditText(context, attrs) { private val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager private var lastPasteTime: Long = 0 private val pasteCooldown = 1000 // 1秒冷却 init { // 监听剪贴板变化 clipboardManager.addPrimaryClipChangedListener { // 检测到剪贴板变化后禁用粘贴 isPasteEnabled = false postDelayed({ isPasteEnabled = true }, pasteCooldown) } } override fun onTextContextMenuItem(id: Int): Boolean { when (id) { android.R.id.cut -> { showToast("剪切功能已禁用") return false } android.R.id.copy -> { showToast("复制功能已禁用") return false } android.R.id.paste -> { if (System.currentTimeMillis() - lastPasteTime < pasteCooldown) { showToast("粘贴操作过快,请稍后再试") return false } lastPasteTime = System.currentTimeMillis() // 允许粘贴但记录日志 logPasteEvent() } } return super.onTextContextMenuItem(id) } private fun logPasteEvent() { // 记录粘贴操作到日志或服务器 Log.d("Security", "用户执行了粘贴操作") } private fun showToast(message: String) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } } ``` #### 方法五:使用 InputFilter 过滤粘贴内容 ```kotlin val pasteFilter = InputFilter { source, start, end, dest, dstart, dend -> // 检测粘贴操作(粘贴内容长度大于1) if (end - start > 1) { // 完全阻止粘贴 return@InputFilter "" // 或者限制粘贴内容长度 // if (end - start > 10) return@InputFilter source.subSequence(0, 10) } null // 允许正常输入 } // 应用过滤器 editText.filters = arrayOf(pasteFilter) ``` #### 完整示例:安全密码输入框 ```xml <com.yourpackage.SecureEditText android:id="@+id/passwordField" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入密码" android:inputType="textPassword" android:imeOptions="actionDone"/> ``` ```kotlin class LoginActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) val passwordField = findViewById<SecureEditText>(R.id.passwordField) // 添加文本变化监听 passwordField.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { // 检测粘贴行为(短时间内输入多个字符) if (count > 1 && before == 0) { passwordField.text?.clear() Toast.makeText(this@LoginActivity, "禁止粘贴密码", Toast.LENGTH_SHORT).show() } } override fun afterTextChanged(s: Editable?) {} }) } } ``` #### 兼容性注意事项 1. **Android 版本兼容**: - API 11+:使用 `customSelectionActionModeCallback` - API 23+:使用 `setTextIsSelectable(false)` 2. **输入法兼容性**: - 某些输入法可能有自己的粘贴功能 - 添加 `android:inputType="textNoSuggestions"` 减少输入法干扰 3. **辅助功能**: - 确保不影响屏幕阅读器等辅助功能 - 提供适当的提示信息 4. **替代方案**: ```java // 完全禁用编辑功能(Java实现) editText.setKeyListener(null); editText.setFocusable(false); ``` #### 启用/禁用切换方法 ```kotlin fun enableCopyPaste(editText: EditText, enable: Boolean) { editText.isLongClickable = enable editText.isTextSelectable = enable if (enable) { editText.customSelectionActionModeCallback = null } else { editText.customSelectionActionModeCallback = object : ActionMode.Callback { override fun onCreateActionMode(mode: ActionMode, menu: Menu) = false override fun onPrepareActionMode(mode: ActionMode, menu: Menu) = false override fun onActionItemClicked(mode: ActionMode, item: MenuItem) = false override fun onDestroyActionMode(mode: ActionMode) {} } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值