ClipboardManagerを使用してテキストのコピーと貼り付けを行うではAPI level1(android.text.ClipboardManager)のClipboardManagerを紹介しましたが、API level11(Android3.0)からはandroid.content.ClipboardManager配下のClipboardManagerを使用することが推奨されていますので、今回はAPI level11(android.content.ClipboardManager)のClipboardManagerでテキストのコピーと貼り付けを行う方法を紹介します。
詳細は以下から。
ClipboardManager(android.content.ClipboardManager)
API level11のClipboardManagerではテキストの他にIntentとUriをクリップボードに保存させることができます。
IntentとUriの保存方法については次週以降で解説致しますので、今回はテキストのコピー方法を紹介します。
API level1ではsetTextメソッドの引数にテキストデータを渡すことでテキストのコピーが行えましたが、API level11ではClipDataクラスのオブジェクトを作成し、setPrimaryClip(ClipData clip)メソッドを使用してクリップボードにデータをコピーする流れになります。
ClipDataクラス
ClipDataクラスはクリップボードに保存するデータを格納するためのクラスです。
ClipDataクラスはオブジェクトを生成する為のコンストラクタが2種類用意されています。
・ClipData(CharSequence label, String[] mimeTypes, ClipData.Item item)
第一引数にClipDataのラベル名、第二引数に格納するコンテンツのタイプ、第三引数に格納するデータを指定します。
・ClipData(ClipDescription description, ClipData.Item item)
第一引数にClipDescriptionオブジェクト(ClipDataのラベル名と格納するコンテンツのタイプをプロパティとして保持するクラス)、第二引数に格納するデータを指定します。
どちらのコンストラクタで作成しても特に作成されるオブジェクトに違いはありませんが、今回はClipDescriptionクラスを使用してClipDataオブジェクトを作成する方法を紹介します。
//クリップボードに格納するItemを作成 ClipData.Item item = new ClipData.Item("クリップボードにコピーしたいテキストデータ"); //MIMETYPEの作成 String[] mimeType = new String[1]; mimeType[0] = ClipDescription.MIMETYPE_TEXT_PLAIN; //クリップボードに格納するClipDataオブジェクトの作成 ClipData cd = new ClipData(new ClipDescription("text_data", mimeType), item);
2行目ではクリップボードにコピーするデータを作成しています。
5、6行目ではクリップボードに格納するデータタイプを指定するためのString[]オブジェクトを作成しています。
クリップボードにはテキスト、Uri、Intentが格納できます。今回はテキストデータなので、MIMETYPE_TEXT_PLAINを使用しています。
他のデータを格納するための定数は以下の通りです。
MIMETYPE_TEXT_PLAIN | テキストを表す定数 |
MIMETYPE_TEXT_INTENT | Intentを表す定数 |
MIMETYPE_TEXT_URILIST | Uriを表す定数 |
9行目では2、6行目で作成したClipData.Itemオブジェクトとデータタイプを格納したString[]オブジェクトを使用してClipDataオブジェクトを作成しています。
クリップボードにテキストをコピーする
では実際にクリップボードにテキストをコピーする方法をサンプルコードを通して紹介します。
今回のサンプルではEditTextに入力されたテキストをクリップボードにコピーしています。
まずはサンプルコードから。
EditText et = (EditText)findViewById(R.id.editText1); //クリップボードに格納するItemを作成 ClipData.Item item = new ClipData.Item(et.getText()); //MIMETYPEの作成 String[] mimeType = new String[1]; mimeType[0] = ClipDescription.MIMETYPE_TEXT_URILIST; //クリップボードに格納するClipDataオブジェクトの作成 ClipData cd = new ClipData(new ClipDescription("text_data", mimeType), item); //クリップボードにデータを格納 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); cm.setPrimaryClip(cd);
基本的にはClipDataクラスの解説で使用したコードとほぼ同じです。
15行目でsetPrimaryClipメソッドを使用して、クリップボードに作成したClipDataオブジェクトを格納しています。
クリップボードのテキストを取得する
次にクリップボードからテキストデータを取得する方法を紹介します。
今回のサンプルコードではクリップボードから取得したテキストをEditTextにセットしています。(サンプルはこちらからSVN等を使用してダウンロードして下さい。)
まずはサンプルコードから。
//システムのクリップボードを取得 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); //クリップボードからClipDataを取得 ClipData cd = cm.getPrimaryClip(); //クリップデータからItemを取得 if(cd != null){ ClipData.Item item = cd.getItemAt(0); EditText et = (EditText)findViewById(R.id.editText2); et.setText(item.getText()); }
5行目ではgetPrimaryClipメソッドを使用して、システムのクリップボードからClipDataオブジェクトを取得しています。
9行目では、5行目で取得したClipDataから、実際のデータが格納されているClipData.Itemオブジェクトを取得しています。
11行目ではClipData.ItemクラスのgetTextメソッドを使用して、クリップボードに格納されているテキストデータを取得し、EditTextにセットしています。