Como copiar texto programaticamente no meu aplicativo Android?


231

Estou criando um aplicativo Android e quero copiar o valor do texto de um widget EditText. É possível que o usuário pressione Menu+Ae Menu+Ccopie o valor, mas como eu faria isso programaticamente?



Esta é basicamente uma pergunta duplicada de: stackoverflow.com/a/13517876/2116185
user2116185

Respostas:


419

Use o ClipboardManager#setPrimaryClipmé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 da API


7
Useimport android.content.ClipboardManager;
MatheusJardimB

Esta função funciona na API 11+ (incluindo pirulito) ou não?
Ashraf Alshahawy

22
O que é label?
Alaa M.

2
você também pode adicionar mensagem de sucesso após a cópia para dizer ao usuário que o texto é copiadoContext context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

1
@AlaaM. Eu acho que essa bandeja clipe é opção a partir da LG e você não pode controlá-lo
Shady Sherif

217

Portanto, todos concordam em como isso deve ser feito, mas como 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);
}

Suponho que você tenha algo como o seguinte declarado em manifesto:

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

Não funciona, porque o compilador gera um erro: A chamada requer nível de API 11 (o min atual é 7): android.content.ClipboardManager # setPrimaryClip line 245 Problema no Android Lint.
JavaRunner

2
Você adicionou target e min sdk ao seu manifesto? Se sim, desative o aviso de cotão.
11402 Warpzit

4
Adicione as seguintes 3 linhas acima do método @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("descontinuação"), @TargetApi (11) ........ . Foi o que eu fiz e funciona.
RRTW 17/01

2
Alguém por favor pode me dizer o que é exatamente o uso de labelno newPlainTextmétodo? a documentação afirma label User-visible label for the clip data.. Mas quando é labelvisível para o usuário? E que tipo de valor / nome devo colocar label?
shadyinside

@tannerjohn Meu palpite é que é algum tipo de visualização usada em algum lugar. Mas eu não sei onde. Mas você pode simplesmente usar o mesmo texto duas vezes ...
Warpzit

15

A pesquisa no Google leva você para android.content.ClipboardManager e você pode decidir, como eu, que a área de transferência não está disponível na API <11, porque a página da documentação diz "Desde: API Nível 11".

Na verdade, existem duas classes, a segunda estendendo a primeira - android.text.ClipboardManager e android.content.ClipboardManager.

android.text.ClipboardManager existe desde a API 1, mas funciona apenas com conteúdo de texto.

android.content.ClipboardManager é a maneira preferida de trabalhar com a área de transferência, mas não está disponível no nível de API <11 (Honeycomb).

Para obter qualquer um deles, você precisa do seguinte código:

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Mas para a API <11, você precisa importar android.text.ClipboardManagere para a 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());
}

você pode tentar isso ..


8

Aqui está um código para implementar algumas funções de copiar e colar do EditText (graças ao Warpzit para verificação da versão). Você pode conectá-los ao 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());
        }
    }
}

Não é possível chamar os métodos de copiar / colar / cortar do android sem escrevê-los como você está fazendo? Eu criei uma barra de ferramentas de seleção de texto personalizada com a funcionalidade para que o usuário possa tornar um texto selecionado em negrito / itálico / sublinhado etc. mas após a personalização, as funções padrão copiar / colar / cortar não funcionam mais, mas os ícones eles ainda aparece?

O que é o "WordKeeper"?
desenvolvedor android

7

Atualização da biblioteca de suporte do Android

No Android Oreo, a biblioteca de suporte apenas desce para a API 14. A maioria dos aplicativos mais novos provavelmente também possui uma API mínima de 14 e, portanto, não precisa se preocupar com os problemas com a API 11 mencionados em algumas das outras respostas. Muito do código pode ser limpo. (Mas veja meu histórico de edições, se você ainda suporta versões inferiores.)

cópia de

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

Colar

Estou adicionando esse código como um bônus, porque copiar / colar geralmente é feito 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 android.content.ClipboardManagerversão em vez da antiga android.text.ClipboardManager. O mesmo para ClipData.
  • Se você não estiver em uma atividade, poderá obter o serviço context.getSystemService().
  • Eu usei um bloco try / catch para obter o texto da colagem porque várias coisas podem ser null. Você pode verificar cada um se achar mais legível.

1
Para que serve o "rótulo de texto"?
desenvolvedor android

@androiddeveloper, nunca usei o rótulo para nada, mas veja estas perguntas e respostas .
Suragch

Portanto, mesmo dizendo que é visível para os usuários, na verdade não é, e depende dos desenvolvedores usá-lo, se necessário.
desenvolvedor android

5

Para habilitar a copiar / colar padrão para o TextView, U pode escolher um dos seguintes:

Alteração no arquivo de layout: adicione a propriedade abaixo ao seu TextView

android:textIsSelectable="true"

Na sua classe Java, escreva esta linha dois, defina gramaticalmente.

myTextView.setTextIsSelectable(true);

E pressione e segure o TextView para ver a barra de ação copiar / colar.


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

E importar import android.content.ClipboardManager;


3

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

Use o método 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); 

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

É importante usar esta importação:

import android.content.ClipboardManager;

Por que você copia \ cola respostas? O que é etiqueta?
AlexS 24/01

@ Alexs como eu disse, outro amigo já deu uma resposta correta, só estou postando outra maneira com mais detalhes, acho que seria útil para alguém
Trinity

1

Aqui está o meu código de trabalho

/**
 * 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);

    }
}

Quando você compartilhou um código, tente explicá-lo. Você pode visitar e verificar como responder a uma pergunta .
Yunus Temurlenk em

@YunusTemurlenk Obrigado por suas sugestões, da próxima vez editarei minhas respostas com uma descrição
Mehul Boghra 25/02

1

Para o Kotlin, podemos usar o seguinte método. Você pode colar esse método dentro de uma atividade ou fragmento.

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

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

}

Obrigado! A context.era a parte que estava faltando - poderia ser porque eu estou fazendo isso dentro de um fragmento.
Cullub 12/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.