Как скопировать текст программно в моей Android приложения?

голоса
181

Я построение Android приложения , и я хочу , чтобы скопировать текстовое значение виджета EditText. Это возможность для пользователя нажать Menu+Aто , Menu+Cчтобы скопировать значение, но как бы я это сделать программно?

Задан 26/10/2008 в 18:13
источник пользователем
На других языках...                            


8 ответов

голоса
325

http://developer.android.com/reference/android/content/ClipboardManager.html

Используйте ClipboardManager.setPrimaryClipметод:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Ответил 26/10/2008 d 18:20
источник пользователем

голоса
205

Так что все согласны о том, как это должно быть сделано, но так как никто не хочет, чтобы дать полное решение, здесь идет:

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" />
Ответил 13/06/2012 d 10:56
источник пользователем

голоса
13

Googling приносит вам android.content.ClipboardManager и вы можете решить, как я сделал, что буфер обмена не доступна на API <11, поскольку страница документации говорит: «С: API Level 11».

Есть на самом деле два класса, второй один продолжающий первый - 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

Ответил 30/03/2012 d 11:59
источник пользователем

голоса
12
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());
}

Вы можете попробовать это ..

Ответил 31/10/2011 d 13:01
источник пользователем

голоса
7

Вот код, чтобы реализовать некоторые функции копирования и вставки из 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());
        }
    }
}
Ответил 11/11/2014 d 15:45
источник пользователем

голоса
4

Чтобы включить стандартную копирования / вставки для TextView, U может выбрать одно из следующих действий:

Изменения в файле макета: добавьте ниже собственности вашего TextView

android:textIsSelectable="true"

В своем классе Java написать эту строку два набора грамматически.

myTextView.setTextIsSelectable(true);

И долгое нажатие на TextView вы можете увидеть панель действий копирования / вставки.

Ответил 05/08/2016 d 11:47
источник пользователем

голоса
2

@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;
Ответил 18/04/2017 d 21:26
источник пользователем

голоса
1

копия

Этот ответ добавляет две строки коды в отличном ответ Warpzit в том , что необходимо для подавления предупреждений компилятора о устаревании и новых API.

Это позволяет до сих пор поддерживают устройства ниже API 11.

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private void copyText() {

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

Вставить

Я добавляю этот код в качестве бонуса, так как копирование / вставка, как правило, делается в парах.

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public void pasteText() {

    int sdk = android.os.Build.VERSION.SDK_INT;
    CharSequence pasteString = "";
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        try {
            pasteString = clipboard.getText();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.getPrimaryClip() != null) {
            android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
            pasteString = item.getText();
        }
    }

    if (pasteString != null) {
        // use it
    }
}
Ответил 28/11/2016 d 04:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more