Android的文本和输入---复制和粘贴(二)

剪贴板相关的类

ClipboardManager

在Android系统中,系统的剪贴板是由一个全局的ClipboardManager类来代表的。你不能直接实例化这个类,相反,要通过调用getSystemService(CLIPBOARD_SERVICE)方法来获得对它的引用。

ClipData、ClipData.Item和ClipDescription

要把数据添加到剪贴板上,你就要创建一个包含数据描述和数据自身的ClipData对象。剪贴板每次只会持有一个ClipData对象。ClipData对象中包含了一个ClipDescription对象和一个或多个ClipData.Item对象。

ClipDescription对象包含了关于Clip的元数据,尤其是它包含了一个针对剪贴数据有效的MIME类型数组。当你把一个剪贴对象放到剪贴板上时,这个数组对执行粘贴处理的应用程序是有效的,可以用它来检查粘贴应用程序是否能够处理这些有效的MIME类型。

ClipData.Item对象包含了文本、URI或Intent类型的数据:

文本是一个CharSequence类型的字符串

URI是一个Uri对象,尽管任意类型的URI都是允许的,但通常这个对象中包含了一个内容提供器的URI。提供数据的应用程序把URI放到剪贴板上。想要粘贴数据的应用程序会从剪贴板上获取这个URI,并使用它访问内容提供器(或其他的数据源)来获取数据。

Intent是一个Intent对象。这种类型允许你把一个应用程序的快捷方式复制到剪贴板上。然后用户把该快捷方式剪贴到它们的应用程序中留作以后使用。

你可以把多个ClipData.Item对象添加到剪贴板上。这就允许用户把多项选择作为一个单独的剪贴对象。例如,如果你有一个列表窗口,它允许用一次选择多个列表项,你就可以一次性的把所有的选择项目复制到剪贴板上。要做这件事情,你就要给每个列表项分别创建一个ClipData.Item对,然后把每个ClipData.Item对象添加到ClipData对象中。

ClipData类的方法

ClipData类为创建一个带有一个ClipData.Item对象和一个简单的ClipDescription对象的ClipData对象提供了静态的便利的方法:

newPlainText(label, text)

这个方法返回了一个ClipData对象,它带有一个包含文本字符串的ClipData.Item对象。ClipDescription对象的标签被设置为label,MIME类型是MIMETYPE_TEXT_PLAIN

使用newPlainText()方法来创建一个文本字符串类型的剪贴对象。

newUri(resolver, label, URI)

这个方法返回一个ClipData对象,它带有一个包含URI的ClipData.Item对象。ClipDescription对象的标签被设置为label。如果URI是一个内容的URI(Uri.getScheme()方法返回content:),那么这个方法就要使用resolver参数中提供的ContentResolver对象从内容提供器中获取有效的MIME类型,并把它们保存在ClipDescription对象中。对于不是content:类型的URI,这个方法会把MIME类型设置为MIMETYPE_TEXT_URILIST。

使用newUri()方法从一个URI中创建一个剪贴对象,特别是content:类型的。

newIntent(label, intent)

这个方法返回一个ClipData对象,它带有一个单独的包含Intent对象的ClipData.Item对象。ClipDescription对象标签被设置为label,MIME类型是MIMETYPE_TEXT_INTENT。

使用newIntent()方法从一个Intent对象中创建一个剪贴对象。

强制把剪贴板数据转换成文本

即使你的应用程序只处理文本,你也可以使用ClipData.Item.coerceToText()方法把剪贴板的非文本数据转换成文本。

这个方法把ClipData.Item中的数据转换成文本,并返回一个CharSequence类型的字符串。ClipData.Item.coerceToText()方法会根据ClipData.Item中的数据格式来返回文本值:

Text:如果ClipData.Item是文本(getText()方法返回值不是null),那么coerceToText()方法会返回该文本。

URI:如果ClipData.Item是一个URI(getUri()方法返回值不是null),coerceToText()方法会尝试把它作为一个内容的URI:

     1. 如果该URI是一个内容的URI,并且它的提供器可以返回一个文本流,coerceToText()方法会返回一个文本流。

     2. 如果该URI是一个内容的URI,但是它的提供器不能提供一个文本流,那么coerceToText()方法会该URI的表达式。这个表达式与Uri.toString()方法的返回值相同。

     3. 如果该URI不是一个内容的URI,那么coerceToText()方法会该URI的表达式。这个表达式与Uri.toString()方法的返回值相同。

Intent:如果ClipData.Item是一个Intent对象(getIntent()方法返回值不是null),coerceToText()方法会把它转换成一个Intent的URI,并且返回它。这个表达式与Intent.toUri(URI_INTENT_SCHEME)方法的返回值相同。

剪贴板框架如下图1。

图1.Android剪贴板框架

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值