您的位置:首页 > 移动开发 > Android开发

Android中的复制粘贴

2015-09-15 23:10 549 查看

TheClipboardFramework

  当使用clipboardframework时,把数据放在一个剪切对象(clipobject)里,然后这个对象会放在系统的剪贴板里。

  clipobject可以有三种形式:

  Text:文字字符串。

  文字是直接放在clip对象中,然后放在剪贴板里;粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入你的应用存储中。

  URI:一个
Uri
对象。


  表示任何形式的URI。这种形式主要用于从一个contentprovider中复制复杂的数据。

  复制的时候把一个
Uri
对象放在一个clip对象中,然后再放在剪贴板里;粘贴的时候取出这个clip对象,得到Uri,把它解析为一个数据资源比如contentprovider,然后从资源中复制数据到应用存储中。

  Intent:
Intent
对象。


  这支持了复制应用快捷方式。

  复制的时候把Intent对象放在clip对象中,再放入剪贴板;粘贴数据时,从clip对象中得到Intent对象,放入应用存储区域中。

  剪贴板每次仅会持有一个clip对象,当应用放另一个clip对象进来时,前一个就消失了。

剪贴板的类

[b]ClipboardManager[/b]

  ClipboardManager代表了系统的剪贴板,通过getSystemService(CLIPBOARD_SERVICE)获取。

  全名为android.text.ClipboardManager从API11开始就废弃了。

  取而代之的是它的子类:android.content.ClipboardManager(sinceAPILevel11)。

[b]ClipData,ClipDescription,andClipData.Item[/b]

  前面说的clip对象就是ClipData类的对象,其中包含了一个
ClipDescription
对象和一个或多个
ClipData.Item
对象。

  ClipDescription对象中包含了一个数组,描述clip对象的MIME类型。

  ClipData.Item对象中包含文字、URI或者Intent数据。一个clip对象中可以包含一个或多个Item对象

  比如你想要复制list中的多项数据,你可以为list中的每一项创建一个ClipData.Item对象,然后把它们放进一个ClipData对象中,这样就一次性把多项数据都放在了剪贴板中。

  注意ClipData这个类是API11才有的。

[b]ClipData中的简洁方法[/b]

  ClipData类中有一些静态的简洁方法,用于创建只有一个ClipData.Item和一条简单描述(
ClipDescription
)的ClipData对象。

  newPlainText(label,text)返回ClipData对象,数据是文字text,描述是label,MIME类型是
MIMETYPE_TEXT_PLAIN


  类似的有:

  newUri(resolver,label,URI)

  newIntent(label,intent)

[b]把剪贴板中的数据强转为文字[/b]

  剪贴板中的非text数据可以通过ClipData.Item.coerceToText()方法转换为text处理。

  1.这个方法首先会检测item是不是包含text,如果有就直接返回。

  2.不包含text,之后看是否有URI:

  如果这个URI是contentURI,并且provider返回文字流,coerceToText()就返回该文字流;

  如果provider不返回文字流,或者这个URI根本不是contentURI,coerceToText()方法会返回URI的表达,即
Uri.toString()


  3.最后,如果这个item即不包含text也没有URI,那么它就应该包含Intent,
coerceToText()
方法会把Intent对象转化为一个IntentURI返回,  和
Intent.toUri(URI_INTENT_SCHEME)
一样。

[b]Androidclipboardframework总结[/b]

  如图:



复制到剪贴板

  1.首先,获取剪贴板服务:

//Getsahandletotheclipboardservice.
ClipboardManagerclipboard=(ClipboardManager)
getSystemService(Context.CLIPBOARD_SERVICE);


  2.然后把数据放在ClipData对象中。

  对文字:

//Createsanewtextcliptoputontheclipboard
ClipDataclip=ClipData.newPlainText("simpletext","Hello,World!");


  对URI:

//CreatesaUribasedonabaseUriandarecordIDbasedonthecontact'slastname
//DeclaresthebaseURIstring
privatestaticfinalStringCONTACTS="content://com.example.contacts";

//DeclaresapathstringforURIsthatyouusetocopydata
privatestaticfinalStringCOPY_PATH="/copy";

//DeclarestheUritopastetotheclipboard
UricopyUri=Uri.parse(CONTACTS+COPY_PATH+"/"+lastName);

...

//CreatesanewURIclipobject.ThesystemusestheanonymousgetContentResolver()objectto
//getMIMEtypesfromprovider.Theclipobject'slabelis"URI",anditsdatais
//theUripreviouslycreated.
ClipDataclip=ClipData.newUri(getContentResolver(),"URI",copyUri);


  对Intent:

//CreatestheIntent
IntentappIntent=newIntent(this,com.example.demo.myapplication.class);

...

//CreatesaclipobjectwiththeIntentinit.Itslabelis"Intent"anditsdatais
//theIntentobjectcreatedpreviously
ClipDataclip=ClipData.newIntent("Intent",appIntent);


  3.把clip对象放在剪贴板中:

//Settheclipboard'sprimaryclip.
clipboard.setPrimaryClip(clip);




从剪贴板中粘贴

  以文字的粘贴为例,其他略。

  例子如下:

packagecom.example.helloclipboard;

importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.ClipData;
importandroid.content.ClipboardManager;
importandroid.content.Context;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
importandroid.widget.Toast;

publicclassHelloClipboardMainActivityextendsActivity{

privateEditTextmEditText1=null;
privateTextViewmResultTextView=null;

privateClipboardManagermClipboard=null;

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_clipboard_main);

mResultTextView=(TextView)findViewById(R.id.textView1);
mEditText1=(EditText)findViewById(R.id.editText1);
ButtoncopyButton=(Button)findViewById(R.id.button1);

ButtonpasteButton=(Button)findViewById(R.id.button2);

copyButton.setOnClickListener(mOnClickListener);
pasteButton.setOnClickListener(mOnClickListener);

}

privateOnClickListenermOnClickListener=newOnClickListener(){

@Override
publicvoidonClick(Viewv){

switch(v.getId()){
caseR.id.button1:
copyFromEditText1();
break;
caseR.id.button2:
pasteToResult();
break;

default:
break;
}
}
};

privatevoidcopyFromEditText1(){

//Getsahandletotheclipboardservice.
if(null==mClipboard){
mClipboard=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);

}

//Createsanewtextcliptoputontheclipboard
ClipDataclip=ClipData.newPlainText("simpletext",
mEditText1.getText());

//Settheclipboard'sprimaryclip.
mClipboard.setPrimaryClip(clip);
}

privatevoidpasteToResult(){
//Getsahandletotheclipboardservice.
if(null==mClipboard){
mClipboard=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
}

StringresultString="";
//检查剪贴板是否有内容
if(!mClipboard.hasPrimaryClip()){
Toast.makeText(HelloClipboardMainActivity.this,
"Clipboardisempty",Toast.LENGTH_SHORT).show();
}
else{
ClipDataclipData=mClipboard.getPrimaryClip();
intcount=clipData.getItemCount();

for(inti=0;i<count;++i){

ClipData.Itemitem=clipData.getItemAt(i);
CharSequencestr=item
.coerceToText(HelloClipboardMainActivity.this);
Log.i("mengdd","item:"+i+":"+str);

resultString+=str;
}

}
mResultTextView.setText(resultString);
}
}


设计有效的复制粘贴功能

  为了设计有效的复制粘贴功能,以下几点需要注意:

  1.任何时间,都只有一个clip对象在剪贴板里。

  新的复制操作都会覆盖前一个clip对象,因为用户可能从你的应用中退出,从其他应用中拷贝一个东西,所以你不能假定用户在你的应用中拷贝的上一个东西一定还放在剪贴板里。

  2.一个clip对象,即ClipData中的多个
ClipData.Item
对象是为了支持多选项的复制粘贴,而不是为了支持单选的多种形式。

  你通常需要clip对象中的所有的项目,即ClipData.Item有一样的形式,比如都是文字,都是URI或都是Intent,而不是混合各种形式。

  3.当你提供数据时,你可以提供不同的MIME表达方式。

  将你支持的MIME类型加入到ClipDescription中去,然后在你的contentprovider中实现它。

  4.当你从剪贴板得到数据时,你的应用有责任检查可用的MIME类型,然后决定使用哪一个。

  即便有一个clip对象在剪贴板中并且用户要求粘贴,你的应用有可能不需要进行粘贴操作。

  你应该在MIME类型兼容的时候执行粘贴操作。你可以选择使用
coerceToText()
方法将粘贴的内容转换为文字。

  如果你的应用支持多种类型,你可以让用户自己选用哪一个。

参考资料

  APIGuides:CopyandPaste:

  http://developer.android.com/guide/topics/text/copy-paste.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: