复制和粘贴
Copy and Paste
译者署名:呆呆大虾
译者链接:
版本:Android 4.0 r1
快速查看
∙用于复制粘贴数据的基于剪贴板的框架。
∙同时支持简单和复杂的数据,包括文本
串、复杂的数据结构、文本和二进制流数
据、程序asset。
∙直接从剪贴板复制粘贴简单文本。
∙用content provider复制粘贴复杂数据。
∙需要API 11版本。
斯琴格日乐老公
他伤心了作文500字五年级
Android为复制和粘贴提供了强大的基于剪贴板的框架。该框架同时支持简单和复杂数据类型,包括文本字符串、复杂数据结构、文本和二进制流数据、甚至程序asset。简单文本数据直接存储于剪贴板内,而复杂数据则保存为一个引用,粘贴应用可利用内容提供器(content provider)进行解析。复制和粘贴可在应用程序内部或多个实现此框架的应用程序之间进行。
因为框架的一部分用到了content provider,本文讨论的内容与Android Content Provider API有些类似,这些API已在Content Provider一章中描述。
剪贴板框架
使用剪贴板框架时,可把数据放入剪辑(clip)对象,然后把该对象放入系统级剪贴板中。clip对象可以是以下三种形式:
Text
文本串。可以直接把字符串放入clip对象,然后把clip对象放入剪贴板中。需要粘贴字符串时,从剪贴板中获取clip对象,然后把字符串拷贝到应用程序的存储中即可。
URI
Uri对象表示任何形式的URI。这主要用于从content provider复制复杂数据。复制数据时,先将Uri对象放入一个clip对象,再把clip对象放入剪贴板中。需要粘贴数据时,先获取clip对象,再获取Uri对象,再把Uri解析到诸如content provider之类的数据源中,然后就能从此数据源中把数据拷贝到应用程序的存储中了。
Intent
汪涵资料一个Intent。这为复制应用程序快捷方式提供了支持。复制数据时,先创建一个Intent 并把它放入一个clip对象,再把clip对象放入剪贴板。需要粘贴数据时,可以获取clip 对象并把Intent对象拷贝到应用程序的内存中。
剪贴板同时仅保存一个clip对象。当应用程序把一个clip对象放入剪贴板时,前一个clip
对象将会消失。
如果要允许用户把数据粘贴到应用程序中,没必要对所有类型数据都进行处理。在让用户选择粘贴之前,可以先对剪贴板中的数据进行检测。除了包含指定格式的数据之外,clip对象还包含了元数据,它能说明数据是属于哪种格式或MIME类型。此元数据有助于应用程序确定对剪贴板数据执行合适的操作。比如,假定应用程序主要是处理文本信息的,那就可以忽略包含URI和Intent的clip对象。
还有可能要允许用户只粘贴文本,而不论剪贴板中的数据格式如何。要实现这个目标,可以把剪贴板数据强制转换为文本格式,然后粘贴这些文本。这将在将剪贴板内数据强制转换为文本一节中描述。
剪贴板类
本节描述类剪贴板框架中所用到的类。
ClipboardManager
在Android系统中,系统剪贴板由全局ClipboardManager类表示。此类不需要直接初始化,而是提交getSystemService(CLIPBOARD_SERVICE)来获取一个引用。
ClipData、ClipData.Item和ClipDescription
要把数据加入剪贴板,可以创建一个ClipData对象,它包含了数据描述信息和数据本身。剪贴板每次只保存一个ClipData对象。一个ClipData包含了一个ClipDescription 对象和一个以上的ClipData.Item对象。
ClipDescription对象包含了clip相关的元数据信息。特别重要的是,它包含了一个clip 数据所对应MIME类型的数组。把clip放入剪贴板后,粘贴应用程序可以利用此数组,程序可以检查此数组以确定其对这些MIME类型的处理能力。
一个ClipData.Item对象包含了文本、URI或Intent数据:
Text
一个CharSequence。
URI
一个Uri。虽然可以是任何URI值,但通常是包含一个content provider URI。提供数据的应用程序把URI放入剪贴板。需要粘贴数据的应用程序从剪贴板中获取URI,并将它用于访问content provider(或者其它数据源)并取回数据。
Intent
一个Intent。本数据类型允许把应用程序的快捷方式复制到剪贴板中。用户可以在后续的使用中把快捷方式粘贴到其它应用程序中。
可以在一个clip中加入多个ClipData.Item对象。这使得用户可以把多个选中值复制为同一个clip。比如,如果有一个列表widget允许用户一次选择多个选项,就可以把所有选中项一次复制到剪贴板中。要实现这一点,为每个列表项创建一个ClipData.Item,然后把这些ClipData.Item对象加入ClipData对象即可。
ClipData常用方法
ClipData类提供了便捷的静态方法来创建一个ClipData对象,附带一个
ClipData.Item对象和一个简单的ClipDescription对象作为参数:
newPlainText(label, text)
返回包含了单个ClipData.Item对象的ClipData对象,此item对象内含一个文本字符串。ClipDescription对象的标签设置为label。ClipDescription的MIME 类型是MIMETYPE_TEXT_PLAIN。
newPlainText()用于创建一个文本字符串clip。
newUri(resolver, label, URI)
高贵的施舍返回一个包含单个ClipData.Item的ClipData对象,此item对象内含一个URI。
ClipDescription对象的标签设置为label。如果URI是一个content类型的URI (Scheme()返回content:),则该方法将用resolver的
ContentResolver对象从content provider中获取可用的MIME类型,并把这些类型保存到ClipDescription中。对于不是content:的URI ,该方法把MIME type 设置为MIMETYPE_TEXT_URILIST。
newUri()用于创建一个URI的clip,特别是content: URI。
newIntent(label, intent)
返回一个包含单个ClipData.Item的ClipData对象,此item对象内含一个
Intent。ClipDescription对象的标签设置为label。MIME类型置为
MIMETYPE_TEXT_INTENT。
newIntent()用于创建一个Intent对象的clip。
度娘天天向上
将剪贴板内数据强制转换为文本
如果应用程序仅需处理文本,可用ToText()方法转换一下,就可以从剪贴板复制非文本数据。
本方法将把ClipData.Item中的数据转换为文本,并且返回一个CharSequence。ToText()的返回值根据ClipData.Item中的数据格式来确定:
Text
如果ClipData.Item是文本(getText()不为null),则coerceToText()返回文本。
凌潇肃演的电视剧URI
ClipData.Item是个URI(getUri()不为null),则coerceToText()会尝试将其视为content URI:
∙如果URI是个content URI且provider能够返回文本流,则coerceToText()返回文本流。
∙如果URI是个content URI但provider无法提供文本流,则coerceToText()返回URI的字符串表示形式。该字符串表示形式与String()的返回
值一致。
∙如果URI不是一个content URI,则coerceToText()返回URI的字符串表示形式。该字符串表示形式与String()的返回值一致。
Intent
如果ClipData.Item是个Intent(getIntent()不为null),则coerceToText()将其转换为Intent URI后返回。该字符串表示形式与
剪贴板的整体框架如图1所示。在复制数据时,应用程序将ClipData对象放入全局的ClipboardManager剪贴板中。ClipData内含了一个或多个ClipData.Item对象,以及一个ClipDescription对象。在粘贴数据时,应用程序先获取ClipData,从ClipDescription中读取MIME类型信息,再从ClipData.Item中或ClipData.Item 指向的content provider中读取数据。