Android Clipboard(复制/剪贴板)

Android提供的剪贴板框架,复制和粘贴不同类型的数据。数据可以是文本,图像,二进制流数据或其它复杂的数据类型。

Android提供ClipboardManager、ClipData.Item和ClipData库使用复制和粘贴的框架。为了使用剪贴板的框架,需要把数据转化为剪辑对象,然后把该对象为全系统剪贴板。

为了使用剪贴板,需要通过调用getSystemService()方法来实例化ClipboardManager的对象。它的语法如下:

ClipboardManager myClipboard;
myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

复制数据

需要做的下一件事就是通过调用ClipData类的数据方法的相应类型来实例化ClipData对象。如果文本数据在newPlainText方法被调用。必须将数据设置为剪贴板管理器对象的剪辑。它的语法如下:

ClipData myClip;
String text = "hello world"; myClip = ClipData.newPlainText("text", text); myClipboard.setPrimaryClip(myClip);

ClipData对象可以采取这三种形式和下面的函数用于创建的那些形式。

Sr.No ClipData形式与方法
1 Text
newPlainText(label, text)
返回ClipData对象,其单个ClipData.Item对象包含一个文本字符串
2 URI
newUri(resolver, label, URI)
返回ClipData对象,其单ClipData.Item对象包含一个URI
3 Intent
newIntent(label, intent)
返回ClipData对象,其单ClipData.Item对象包含意图

粘贴数据

为了粘贴数据,先要通过调用getPrimaryClip()方法拿到剪辑。并从点击就可 ClipData.Item 对象的项目。从对象将得到数据。它的语法如下:

ClipData abc = myClipboard.getPrimaryClip(); ClipData.Item item = abc.getItemAt(0); String text = item.getText().toString();

除了这些方法,也有用于管理剪贴板框架提供 ClipboardManager类的其他方法。这些方法如下:

Sr.No 方法及说明
1 getPrimaryClip()
这个方法只是返回剪贴板上的当前主片段
2 getPrimaryClipDescription()
此方法返回剪贴板上的当前主剪辑的说明,但不是它的数据的一个拷贝
3 hasPrimaryClip()
如果当前剪贴板上的主要片段此方法返回true
4 setPrimaryClip(ClipData clip)
此方法将剪贴板上的当前主片段
5 setText(CharSequence text)
这种方法可直接用于复制文本到剪贴板
6 getText()
这种方法可直接用于获取剪贴板复制的文本

例子

这里有一个例子演示如何使用ClipboardManager类。它创建了一个基本的复制粘贴应用程序,可让您复制的文本,然后通过剪贴板粘贴。

为了试验这个例子,可以在实际设备或模拟器运行此程序。

Steps 描述
1 使用Android Studio创建Android应用程序,并将其命名为:Clipboard 。创建这个项目时确保目标SDK编译在Android SDK中的最新版本或使用更高级别的API。
2 修改 src/MainActivity.java 文件添加必要的代码
3 修改res/layout/activity_main.xml 添加相应的XML组件
4 修改 res/values/string. xml添加必要的字符串组成部分
5 运行应用程序并选择运行Android的设备,并在其上安装的应用和验证结果

以下是修改后的主活动文件的内容src/com.yiibai.clipboard/MainActivity.java.

package com.example.clipboard; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private ClipboardManager myClipboard; private ClipData myClip; private EditText copyField,pasteField; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); copyField = (EditText)findViewById(R.id.editText1); pasteField = (EditText)findViewById(R.id.editText2); } @SuppressLint("NewApi") public void copy(View view){ String text = copyField.getText().toString(); myClip = ClipData.newPlainText("text", text); myClipboard.setPrimaryClip(myClip); Toast.makeText(getApplicationContext(), "Text Copied", Toast.LENGTH_SHORT).show(); } @SuppressLint("NewApi") public void paste(View view){ 

以下是经修改res/layout/activity_main.xml 的内容

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="25dp" android:layout_marginTop="19dp" android:text="@string/copytext" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="20dp" android:ems="10" > <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" android:layout_centerVertical="true" android:text="@string/pastetext" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" android:layout_below="@+id/editText1" android:layout_marginLeft="65dp" android:layout_marginTop="20dp" android:onClick="copy" android:text="@string/copy" /> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_below="@+id/textView2" android:layout_marginTop="39dp" android:ems="10" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/editText2" android:layout_marginTop="34dp" android:onClick="paste" android:text=

以下是 res/values/string.xml 的内容

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Clipboard</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="copy">Copy Text</string> <string name="paste">Paste Text</string> <string name="copytext">Text to copy</string> <string name="pastetext">Copied Text</string> </resources>

以下是 AndroidManifest.xml 文件的内容:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.clipboard" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.clipboard.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

让我们试着来运行修改剪贴板应用程序。安装AVD并启动程序,如果一切设置和应用程序都没有问题,它会显示以下仿真器窗口:

Anroid clipboard Tutorial

现在只是在文本输入任何文字复制字段,然后选择复制文本按钮。下面的通知将显示其显示如下:

Android Clipboard(复制/剪贴板)

现在,只要按下按钮,粘贴,会看到它被复制,现在粘贴复制的文本的字段中的文本。它如下所示:

Android Clipboard(复制/剪贴板)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android剪贴板是一个非常常用的功能,它可以帮助我们复制、粘贴文本、图片等内容。下面是Android剪贴板的源码详解。 Android剪贴板的源码主要分为两部分:Framework层和Service层。 **Framework层** Framework层主要负责实现Android剪贴板的核心功能,包括接口定义、数据存储和剪贴板监听等。 1. 接口定义 Android剪贴板的接口定义在android.content.ClipboardManager类中,其定义了一系列操作剪贴板的方法,如下所示: ``` public class ClipboardManager { /** * Set the contents of the clipboard to the specified clipboard data. */ public void setPrimaryClip(ClipData clip) { ...... } /** * Get the contents of the clipboard, which includes the primary clip and any clipped data. */ public ClipData getPrimaryClip() { ...... } /** * Add a listener to be notified when the primary clip changes. */ public void addPrimaryClipChangedListener(OnPrimaryClipChangedListener listener) { ...... } /** * Remove a listener that was previously added with {@link #addPrimaryClipChangedListener}. */ public void removePrimaryClipChangedListener(OnPrimaryClipChangedListener listener) { ...... } } ``` 2. 数据存储 剪贴板的数据存储在系统服务中,使用ClipboardService类来实现数据的存储和读取。在ClipboardService类中,使用了一个HashMap来存储剪贴板的数据,其中键为用户ID,值为剪贴板数据,如下所示: ``` class ClipboardServiceImpl extends IClipboard.Stub { final HashMap<Integer, ClipboardData> mClipboards = new HashMap<Integer, ClipboardData>(); ...... } ``` 3. 剪贴板监听 剪贴板的监听是通过注册Broadcast Receiver实现的,在系统剪贴板数据发生变化时,系统会发送一个广播,可以通过注册Broadcast Receiver来监听这个广播。Android系统提供了一个系统级的剪贴板监听器ClipboardListener,可以通过继承ClipboardListener类来实现剪贴板监听器,如下所示: ``` public abstract class ClipboardManager.ClipboardListener { /** * Called when the primary clip on the clipboard changes. */ public void onPrimaryClipChanged() { ...... } } ``` **Service层** Service层主要负责与应用程序交互,包括提供Binder接口和实现剪贴板服务等。 1. Binder接口 剪贴板的Binder接口定义在android.content.IClipboard.aidl文件中,其定义了一系列操作剪贴板的方法,如下所示: ``` interface IClipboard { /** * Set the contents of the clipboard to the specified clipboard data. */ void setPrimaryClip(in ClipData clip); /** * Get the contents of the clipboard, which includes the primary clip and any clipped data. */ ClipData getPrimaryClip(); /** * Add a listener to be notified when the primary clip changes. */ void addPrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener); /** * Remove a listener that was previously added with {@link #addPrimaryClipChangedListener}. */ void removePrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener); } ``` 2. 剪贴板服务 剪贴板服务的实现类是ClipboardServiceImpl,它继承了IClipboard.Stub类,实现了IClipboard接口中的方法。在剪贴板服务中,使用了一个HashMap来存储剪贴板的数据,其中键为用户ID,值为剪贴板数据。 ``` class ClipboardServiceImpl extends IClipboard.Stub { final HashMap<Integer, ClipboardData> mClipboards = new HashMap<Integer, ClipboardData>(); ...... } ``` 以上就是Android剪贴板的源码详解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值