学习笔记_android之复制黏贴实现方法

原创 2015年11月18日 16:40:27

Android中的复制粘贴

工具类

import android.annotation.SuppressLint;

import android.content.ClipboardManager;

import android.content.Context;

 

public class ClipBoardUtil {

    /**

     * 实现文本复制功能 

     * 

     * @param content

     */

    @SuppressLint(NewApi)

    public static void copy(Context context, String content) {

        // 得到剪贴板管理器

        ClipboardManager cmb = (ClipboardManager) context

                .getSystemService(Context.CLIPBOARD_SERVICE);

        cmb.setText(content.trim());

    }

 

    /**

     * 实现粘贴功能 

     * 

     * @param context

     * @return

     */

    @SuppressLint(NewApi)

    public static String paste(Context context) {

        // 得到剪贴板管理器

        ClipboardManager cmb = (ClipboardManager) context

                .getSystemService(Context.CLIPBOARD_SERVICE);

        return cmb.getText().toString().trim();

    }

 

}

 

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

  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.ClipboardManagerAPI 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,描述是labelMIME类型是MIMETYPE_TEXT_PLAIN

  类似的有:

  newUri(resolver, label, URI)

  newIntent(label, intent)

 

 

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

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

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

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

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

  如果provider不返回文字流,或者这个URI根本不是content URIcoerceToText()方法会返回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 new text clip to put on the clipboard

ClipData clip = ClipData.newPlainText("simple text","Hello, World!");

 

  对URI

// 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 clipboard

Uri 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 Intent

Intent 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 previously

ClipData clip = ClipData.newIntent("Intent",appIntent);

 

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

// Set the clipboard's primary clip.

clipboard.setPrimaryClip(clip);

 

从剪贴板中粘贴

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

  例子如下:

package com.example.helloclipboard;

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 HelloClipboardMainActivity extends Activity {

 

    private EditText mEditText1 = null;

    private TextView mResultTextView = null;

    private ClipboardManager mClipboard = null;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_hello_clipboard_main);

 

        mResultTextView = (TextView) findViewById(R.id.textView1);

        mEditText1 = (EditText) findViewById(R.id.editText1);

        Button copyButton = (Button) findViewById(R.id.button1);

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

        copyButton.setOnClickListener(mOnClickListener);

        pasteButton.setOnClickListener(mOnClickListener);

    }

 

    private OnClickListener mOnClickListener = new OnClickListener() {

 

        @Override

        public void onClick(View v) {

 

            switch (v.getId()) {

            case R.id.button1:

                copyFromEditText1();

                break;

            case R.id.button2:

                pasteToResult();

                break;

 

            default:

                break;

            }

        }

    };

 

    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());

 

        // 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(HelloClipboardMainActivity.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(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中去,然后在你的content provider中实现它。

 

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

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

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

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

 

参考资料

  API Guides: Copy and Paste:

  http://developer.android.com/guide/topics/text/copy-paste.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java 用FlexPaper+SWFTools实现文章可看不可复制黏贴,转化swf,当文件名中含有多个空格,转化失败的原因及解决办法

最近在项目中用FlexPaper+SWFTools实现仿百度文库的功能,其中需要将pdf转化为swf格式,这需要java来执行外部命令。以下是我截取pdf文件转swf文件的关键代码 r = Runti...

关于git bush 中不能复制黏贴的问题

关于git bush 中不能复制黏贴的问题

不错的爬虫,JS..复制黏贴的,连作者的地址和名字都原封不动

Node.js爬虫--网页请求模块 一、为什么我要写这样一个模块? 源于笔者想使用Node.js写一个爬虫,虽然Node.js官方API提供的请求远程资源的方法已经非常简便...

c++复制黏贴

  • 2012年10月26日 18:25
  • 14KB
  • 下载

复制黏贴工具

  • 2014年09月03日 15:58
  • 643KB
  • 下载

js实现禁止复制,黏贴和选取-------Day54

传统意义上的交互,在我理解看来,应该是用户通过键盘操作,电脑z

LESSON1 windows linux文件复制黏贴

  • 2017年06月09日 18:24
  • 110KB
  • 下载

如何用javascript禁用复制黏贴

  • 2012年12月10日 16:15
  • 379B
  • 下载

DevExpress中gridview多单元格的复制、黏贴和撤销

本实例主要实现在同一 GridView 中实现多单元格的复制、黏贴和撤销 实现如下功能: 首先设置 gridView2.OptionsBehavior.Editable = fa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记_android之复制黏贴实现方法
举报原因:
原因补充:

(最多只允许输入30个字)