官网关于复制的教程:https://developer.android.google.cn/guide/topics/text/copy-paste?hl=zh-cn
关于Android 13模拟器无法运行可查看这篇文章:https://blog.csdn.net/android_cai_niao/article/details/131422541
界面UI如下:
界面中有两个输入框,点击 copy
按钮会复制第一个输入框中的文本,点击 paste
按钮会把复制的文本粘贴到第二个输入框,实现代码如下:
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.copyButton.setOnClickListener { copyText() }
binding.pasteButton.setOnClickListener { pasteText() }
}
private fun copyText() {
val text = binding.srcEdit.text.trim().toString()
if (text.isEmpty()) {
Toast.makeText(this, "请输入一些文本", Toast.LENGTH_SHORT).show()
return
}
val cm = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
// 将要复制的数据放到一个剪贴对象中
val clipData = ClipData.newPlainText("", text)
// 设置数据为敏感内容,则在剪贴板中文本会显示为星号
clipData.description.extras = PersistableBundle().apply { putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) }
// 把剪贴对象放到剪切板中
cm.setPrimaryClip(clipData)
// 由于Android 12或更低的版本没有复制反馈,所以这里使用一个toast进行反馈
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
Toast.makeText(this, "已复制", Toast.LENGTH_SHORT).show()
}
}
private fun pasteText() {
val cm = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
// 如果剪贴板有数据,且是文本类型的数据
if (cm.hasPrimaryClip() && cm.primaryClipDescription?.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) == true) {
val item = cm.primaryClip?.getItemAt(0)
val pasteText = item?.text ?: ""
binding.pasteEdit.setText(pasteText)
}
}
}
在Android 13版本中,复制时会提示出复制的内容,且可设置为显示为星号,使用了原生模拟器测试,发现复制时必须在输入法显示的情况下才会有提示,且输入法本身也有显示出复制的内容,而且不显示为星号,复制提示才会显示为星号,所以这个应该是目前的Bug吧,效果如下:
我们把设置为显示星号的代码注释掉再次运行,结果如下:
这时可以看到两个位置都显示出复制的内容了,且都是明文显示。在我的小米11 pro (Android 13)上运行时,无论输入法有无显示,点 “copy” 按钮时均无复制提示,相同的是,如果输入法显示时在输入法上也会显示出复制的内容,且无论是否设置为密文都是明文显示的。
点击 paste
按钮进行粘贴,系统会弹出toast进行提示,效果如下: