253

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

4

14 に答える 14

464

使用ClipboardManager#setPrimaryClip方法:

import android.content.ClipboardManager;

// ...

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

ClipboardManagerAPI リファレンス

于 2008-10-26T17:20:44.483 に答える
218

したがって、これをどのように行うかについては誰もが同意しますが、完全な解決策を提供したい人はいないため、次のようにします。

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" />
于 2012-06-13T09:56:10.537 に答える
16

グーグルでandroid.content.ClipboardManagerに移動すると、ドキュメントページに「以降:APIレベル11」と記載されているため、私が行ったように、クリップボードはAPI<11では使用できないと判断できます。

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

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

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

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

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

于 2012-03-30T10:59:45.830 に答える
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());
}

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

于 2011-10-31T12:01:29.920 に答える
13

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

Android Oreo の時点で、サポート ライブラリは API 14 までしかありません。ほとんどの新しいアプリには、おそらく 14 の最小 API もあるため、他の回答のいくつかで言及されている 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。その方が読みやすいと思われる場合は、それぞれを確認できます。
于 2016-11-28T04:40:40.103 に答える
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());
        }
    }
}
于 2014-11-11T15:45:24.453 に答える
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;
于 2017-04-18T21:26:21.087 に答える
0

アプリがデフォルトの入力方式エディター (IME) であるか、現在フォーカスがあるアプリでない限り、アプリは Android 10 以降でクリップボード データにアクセスできません。 https://developer.android.com/about/versions/10/privacy/changes#clipboard-data

于 2020-07-02T00:36:51.447 に答える