Androidアプリでプログラムによってテキストをコピーする方法は?


231

Androidアプリを作成していて、EditTextウィジェットのテキスト値をコピーしたいと思います。ユーザーがMenu+A次にを押しMenu+Cて値をコピーすることは可能ですが、これをプログラムでどのように実行しますか?



これは基本的には次の重複質問です:stackoverflow.com/a/13517876/2116185
user2116185

回答:


419

使用ClipboardManager#setPrimaryClip方法:

import android.content.ClipboardManager;

// ...

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);

ClipboardManager APIリファレンス


7
使用import android.content.ClipboardManager;
MatheusJardimB 2014

この関数はAPI 11+(ロリポップを含む)で動作しますか?
Ashraf Alshahawy

22
なにlabel
Alaa M.

2
コピー後に成功メッセージを追加して、テキストがコピーされたことをユーザーに知らせることもできますContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

1
@AlaaM。このクリップトレイはLGのオプションであり、制御できないと思います
Shady Sherif

217

だから誰もがこれをどのようにすべきかについて同意しますが、誰も完全な解決策を与えたくないので、ここに行きます:

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText("text to clip");
} else {
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
    android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip");
    clipboard.setPrimaryClip(clip);
}

マニフェストで次のように宣言されていると思います:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

コンパイラーがエラーをスローするため、機能しません。呼び出しにはAPIレベル11(現在の最小値は7)が必要です:android.content.ClipboardManager#setPrimaryClip行245 Android Lint問題。
JavaRunner 2012年

2
マニフェストにターゲットと最小SDKを追加しましたか?はいの場合、lint警告を無効にします。
Warpzit

4
メソッドの上に次の3行を追加します@SuppressLint({"NewApi"、 "NewApi"、 "NewApi"、 "NewApi"})、@SuppressWarnings( "deprecation")、@TargetApi(11)........ 。それは私がやったことであり、それは機能します。
RRTW 2013年

2
labelin newPlainTextメソッドの使用法を正確に教えてください。ドキュメンタリーの状態label User-visible label for the clip data.。しかし、labelユーザーにはいつ表示されますか?そして、どのような値/名前を入れるべきlabelですか?
shadyinside 2014

@tannerjohn私の推測では、どこかで使用されているプレビューのようなものです。しかし、どこにいるかはわかりません。しかし、同じテキストを2回使用することもできます...
Warpzit

15

Googlingを使用するとandroid.content.ClipboardManagerが表示され、ドキュメントページに「Since:API Level 11」と記載されているため、API <11ではクリップボードを使用できないと判断できます。

実際には2つのクラスがあり、2番目のクラスは最初のクラスを拡張しています-android.text.ClipboardManagerとandroid.content.ClipboardManager。

android.text.ClipboardManagerはAPI 1以降に存在しますが、テキストコンテンツでのみ機能します。

android.content.ClipboardManagerはクリップボードでの作業に推奨される方法ですが、APIレベル<11(Honeycomb)では使用できません。

それらのいずれかを取得するには、次のコードが必要です。

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

ただし、API <11の場合、インポートする必要がandroid.text.ClipboardManagerあり、API> = 11の場合 android.content.ClipboardManager


14
public void onClick (View v) 
{
    switch (v.getId())
    {
        case R.id.ButtonCopy:
            copyToClipBoard();
            break;
        case R.id.ButtonPaste:
            pasteFromClipBoard();
            break;
        default:
            Log.d(TAG, "OnClick: Unknown View Received!");
            break;
    }
}

// Copy EditCopy text to the ClipBoard
private void copyToClipBoard() 
{
    ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    clipMan.setPrimaryClip(editCopy.getText());
}

あなたはこれを試すことができます。


8

EditTextからコピーアンドペースト機能を実装するためのコードを次に示します(バージョンチェックについてWarpzitに感謝)。これらをボタンのonclickイベントにフックできます。

public void copy(View v) {      
    int startSelection = txtNotes.getSelectionStart();
    int endSelection = txtNotes.getSelectionEnd();      
    if ((txtNotes.getText() != null) && (endSelection > startSelection ))
    {
        String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection);                
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(selectedText);
        } else {
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
            android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText);
            clipboard.setPrimaryClip(clip);
        }
    }
}   

public void paste(View v) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText());
        }
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
        if (item.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText());
        }
    }
}

あなたがしているようにそれらを書くことなくアンドロイドのコピー/貼り付け/カットメソッドを呼び出すことは不可能ではないですか?ユーザーが選択したテキストを太字/斜体/下線などにできるようにする機能を備えたカスタムテキスト選択ツールバーを作成しましたが、カスタマイズ後、デフォルトの機能であるコピー/貼り付け/切り取りが機能しなくなりましたが、彼らはまだ現れますか?

「WordKeeper」とは何ですか?
Android開発者

7

Androidサポートライブラリの更新

Android Oreoの時点で、サポートライブラリはAPI 14までしかありません。ほとんどの新しいアプリはおそらく最小API 14も備えているため、他のいくつかの回答で言及されているAPI 11の問題について心配する必要はありません。多くのコードをクリーンアップできます。(ただし、まだ下位バージョンをサポートしている場合は、編集履歴を参照してください。)

コピーする

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);

ペースト

コピー/貼り付けは通常ペアで行われるため、このコードをボーナスとして追加します。

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}

ノート

  • android.content.ClipboardManager古いバージョンではなく、必ずバージョンをインポートしてくださいandroid.text.ClipboardManager。同じClipData
  • アクティビティに参加していない場合は、次のサービスを利用できます context.getSystemService()
  • テキストの貼り付けには、try / catchブロックを使用しましたnull。あなたがその方法がより読みやすくなっている場合は、それぞれを確認できます。

1
「テキストラベル」とは
Android開発者

@androiddeveloper、ラベルを実際に使用したことはありませんが、こちらのQ&Aをご覧ください。
Suragch 2017年

したがって、ユーザーには表示されると記載されていても、実際には表示されず、必要に応じて使用するかどうかは開発者に依存しています。
Android開発者

5

TextViewの標準のコピー/貼り付けを有効にするために、Uは次のいずれかを選択できます。

レイアウトファイルの変更:以下のプロパティをTextViewに追加します。

android:textIsSelectable="true"

Javaクラスで、次の2行を文法的に設定します。

myTextView.setTextIsSelectable(true);

TextViewを長押しすると、コピー/貼り付けのアクションバーが表示されます。


5
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

そしてインポート import android.content.ClipboardManager;


3

@FlySwatはすでに正しい答えを出しました、私は完全な答えを共有しています:

ClipboardManager.setPrimaryClip(http://developer.android.com/reference/android/content/ClipboardManager.html)メソッドを使用します。

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip); 

どこにlabel クリップデータのためのユーザに見えるラベルで、 textクリップの実際のテキストです。公式ドキュメントによると。

このインポートを使用することが重要です。

import android.content.ClipboardManager;

なぜ回答をコピーして貼り付けますか?ラベルとは?
AlexS

@AlexSが言ったように、別の友人がすでに正しい答えを出しているので、詳細を別の方法で投稿しています。誰かに役立つと思います
Trinity

1

これが私の作業コードです

/**
 * Method to code text in clip board
 *
 * @param context context
 * @param text    text what wan to copy in clipboard
 * @param label   label what want to copied
 */
public static void copyCodeInClipBoard(Context context, String text, String label) {
    if (context != null) {
        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText(label, text);
        if (clipboard == null || clip == null)
            return;
        clipboard.setPrimaryClip(clip);

    }
}

あなたがコードを共有したとき、それを説明してみてください。にアクセスして、質問への回答方法を確認できます。
Yunus Temurlenk

@YunusTemurlenkご提案ありがとうございます。次回は説明を使用して回答を編集します
Mehul Boghra

1

Kotlinの場合、次の方法を使用できます。このメソッドは、アクティビティまたはフラグメント内に貼り付けることができます。

fun copyToClipBoard(context: Context, message: String) {

    val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clipData = ClipData.newPlainText("label",message)
    clipBoard.setPrimaryClip(clipData)

}

ありがとうございました!context.欠けていたのはこの部分でした-フラグメント内で実行しているためかもしれません。
Cullub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.