官网关于复制的教程:
关于 13模拟器无法运行可查看这篇文章:
【android复制与粘贴】界面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 = http://www.kingceram.com/post/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)}}}
在 13版本中,复制时会提示出复制的内容,且可设置为显示为星号,使用了原生模拟器测试,发现复制时必须在输入法显示的情况下才会有提示,且输入法本身也有显示出复制的内容,而且不显示为星号,复制提示才会显示为星号,所以这个应该是目前的Bug吧,效果如下:
文章插图
我们把设置为显示星号的代码注释掉再次运行,结果如下:
这时可以看到两个位置都显示出复制的内容了,且都是明文显示 。在我的小米11 pro ( 13)上运行时,无论输入法有无显示,点 “copy” 按钮时均无复制提示,相同的是,如果输入法显示时在输入法上也会显示出复制的内容,且无论是否设置为密文都是明文显示的 。
点击 paste 按钮进行粘贴,系统会弹出toast进行提示,效果如下: