Pergunta

Eu estou construindo um aplicativo Android e eu quero copiar o valor de texto de um EditText widget. É possível que o usuário pressione Menu+A então Menu+C para copiar o valor, mas como eu ia fazer isso programaticamente?

Foi útil?

Solução

Use ClipboardManager#setPrimaryClip método:

import android.content.ClipboardManager;

// ...

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

ClipboardManager referência API

Outras dicas

Por isso, todos concordam sobre como isso deve ser feito, mas já que ninguém quer dar uma solução completa, aqui vai:

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

Eu suponho que você tem algo como seguir declarada no manifesto:

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

Googling traz para android.content.ClipboardManager e você poderia decidir, como eu fiz, que Clipboard não está disponível na API <11, porque a página de documentação diz "Desde: API Nível 11".

Na verdade, existem duas classes, segundo estendendo o primeiro -. Android.text.ClipboardManager e android.content.ClipboardManager

android.text.ClipboardManager é existente desde API 1, mas funciona apenas com o conteúdo do texto.

android.content.ClipboardManager é a forma preferida de trabalho com a prancheta, mas ele não está disponível na API Nível <11 (Honeycomb).

Para obter qualquer um deles é necessário o seguinte código:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Mas para API <11 você tem que android.text.ClipboardManager importação e para API> = 11 android.content.ClipboardManager

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

Você pode tentar fazer isso ..

Aqui está um código para implementar algumas copiar e colar funções de EditText (graças a Warpzit para verificação de versão). Você pode ligar estes para evento onclick do seu botão.

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

Android atualização biblioteca de suporte

A partir de Oreo Android, a biblioteca de suporte só vai para baixo a API 14. A maioria dos aplicativos mais recentes provavelmente também tem um min API de 14, e, portanto, não precisa se preocupar com os problemas com API 11 mencionados em algumas das outras respostas. Uma grande parte do código pode ser limpo. (Mas ver meu histórico de edições, se você ainda estão a apoiar as versões mais baixas.)

Copiar

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

Colar

Eu estou adicionando este código como um bônus, porque copiar / colar é feito geralmente em pares.

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

Notas

  • Certifique-se de importar a versão android.content.ClipboardManager ao invés do velho android.text.ClipboardManager. Mesmo para ClipData.
  • Se você não está em uma atividade que você pode obter o serviço com context.getSystemService().
  • Eu usei um bloco try / catch para obter o texto pasta porque várias coisas podem ser null. Você pode verificar cada um, se você achar que forma mais legível.

Para ativar a cópia padrão / colar para TextView, U pode escolher uma das seguintes opções:

Alterar no arquivo de layout: add abaixo propriedade para o seu TextView

android:textIsSelectable="true"

Em seu write classe Java esta linha dois definir o gramaticalmente.

myTextView.setTextIsSelectable(true);

E pressão longa sobre o TextView você pode ver copiar / colar barra de ação.

@FlySwat já deu a resposta correta, eu estou apenas compartilhando a resposta completa:

Use ClipboardManager.setPrimaryClip ( http://developer.android.com/ referência / android / content / ClipboardManager.html ) método:

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

Onde label é um rótulo visível pelo usuário para os dados clipe e text é o texto real no clipe. De acordo com a docs oficiais .

É importante usar esta importação:

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

E import import android.content.ClipboardManager;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top