Estou criando um aplicativo Android e quero copiar o valor do texto de um widget EditText. É possível que o usuário pressione Menu+A
e Menu+C
copie o valor, mas como eu faria isso programaticamente?
Estou criando um aplicativo Android e quero copiar o valor do texto de um widget EditText. É possível que o usuário pressione Menu+A
e Menu+C
copie o valor, mas como eu faria isso programaticamente?
Respostas:
Use o 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);
import android.content.ClipboardManager;
label
?
Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
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" />
label
no newPlainText
método? a documentação afirma label User-visible label for the clip data.
. Mas quando é label
visível para o usuário? E que tipo de valor / nome devo colocar label
?
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.ClipboardManager
e para a 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 isso ..
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());
}
}
}
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.)
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
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;
}
android.content.ClipboardManager
versão em vez da antiga android.text.ClipboardManager
. O mesmo para ClipData
.context.getSystemService()
.null
. Você pode verificar cada um se achar mais legível.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.
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;
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);
}
}
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)
}
context.
era a parte que estava faltando - poderia ser porque eu estou fazendo isso dentro de um fragmento.