Android中的复制粘贴

来源:互联网 发布:mac抓图工具怎么用 编辑:程序博客网 时间:2024/04/27 21:40

MainActivity.java:

import android.os.Bundle;import android.app.Activity;import android.content.ClipData;import android.content.ClipboardManager;import android.content.Context;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener{    private EditText mEditText1 = null;    private TextView mResultTextView = null;    private ClipboardManager mClipboard = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.clipboard_demo);        mResultTextView = (TextView) findViewById(R.id.textView1);        mEditText1 = (EditText) findViewById(R.id.editText1);        Button copyButton = (Button) findViewById(R.id.copy);        Button pasteButton = (Button) findViewById(R.id.paste);        copyButton.setOnClickListener(this);        pasteButton.setOnClickListener(this);    }    /**     * 将editText中文字复制到剪贴板     */    private void copyFromEditText1() {        // Gets a handle to the clipboard service.        if (null == mClipboard) {            mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);        }        // Creates a new text clip to put on the clipboard        ClipData clip = ClipData.newPlainText("simple text",                mEditText1.getText());        //URI//        ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);        //intent//        ClipData clip = ClipData.newIntent("Intent",appIntent);                // Set the clipboard's primary clip.        mClipboard.setPrimaryClip(clip);    }    /**     * 将剪贴板中的文字显示出来     */    private void pasteToResult() {        // Gets a handle to the clipboard service.        if (null == mClipboard) {            mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);        }        String resultString = "";        // 检查剪贴板是否有内容        if (!mClipboard.hasPrimaryClip()) {            Toast.makeText(MainActivity.this,                    "Clipboard is empty", Toast.LENGTH_SHORT).show();        }        else {            ClipData clipData = mClipboard.getPrimaryClip();            int count = clipData.getItemCount();            for (int i = 0; i < count; ++i) {                ClipData.Item item = clipData.getItemAt(i);                CharSequence str = item                        .coerceToText(MainActivity.this);                Log.i("mengdd", "item : " + i + ": " + str);                resultString += str;            }        }        mResultTextView.setText(resultString);    }@Overridepublic void onClick(View v) {        switch (v.getId()) {        case R.id.copy:            copyFromEditText1();            break;        case R.id.paste:            pasteToResult();            break;        default:            break;        }    }}

clipboard_demo.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="TextView" />    <EditText        android:id="@+id/editText1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:ems="10" >    </EditText>    <Button        android:id="@+id/copy"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="copy" />    <Button        android:id="@+id/paste"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="paste" /></LinearLayout>


clip object可以有三种形式:

  Text:文字字符串。

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

  URI:一个Uri 对象。

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

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

  Intent: Intent对象。

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

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

 

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


ClipboardManager

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

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

  取而代之的是它的子类:android.content.ClipboardManager (since API Level 11)。

 

ClipData, ClipDescription, and ClipData.Item

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

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

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

 

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

  注意ClipData这个类是API 11才有的。

 

ClipData中的简洁方法

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

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

  类似的有:

  newUri(resolver, label, URI)

  newIntent(label, intent)

 

 

把剪贴板中的数据强转为文字

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

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

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

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

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

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


复制到剪贴板

1.首先,获取剪贴板服务:
// Gets a handle to the clipboard service.ClipboardManager clipboard = (ClipboardManager)        getSystemService(Context.CLIPBOARD_SERVICE);
2.然后把数据放在ClipData对象中。

对文字:

// Creates a Uri based on a base Uri and a record ID based on the contact's last name// Declares the base URI stringprivate static final String CONTACTS = "content://com.example.contacts";// Declares a path string for URIs that you use to copy dataprivate static final String COPY_PATH = "/copy";// Declares the Uri to paste to the clipboardUri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);...// Creates a new URI clip object. The system uses the anonymous getContentResolver() object to// get MIME types from provider. The clip object's label is "URI", and its data is// the Uri previously created.ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);
对Intent:

// Creates the IntentIntent appIntent = new Intent(this, com.example.demo.myapplication.class);...// Creates a clip object with the Intent in it. Its label is "Intent" and its data is// the Intent object created previouslyClipData clip = ClipData.newIntent("Intent",appIntent);

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

clipboard.setPrimaryClip(clip);




0 0
原创粉丝点击