Come copiare il testo a livello di codice nella mia app Android?
-
04-07-2019 - |
Domanda
Sto costruendo un'app Android e voglio copiare il valore di testo di un widget EditText. È possibile per l'utente premere Menu+A
quindi Menu+C
per copiare il valore, ma come lo farei a livello di codice?
Soluzione
Usa il metodo ClipboardManager#setPrimaryClip
:
import android.content.ClipboardManager;
// ...
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Altri suggerimenti
Quindi tutti concordano su come farlo, ma poiché nessuno vuole dare una soluzione completa, ecco:
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);
}
Presumo che tu abbia qualcosa come segue dichiarato in manifest:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
Googling ti porta su android.content.ClipboardManager e potresti decidere, come ho fatto io, che Appunti non è disponibile su API < 11, perché la pagina della documentazione riporta & Quot; Da: API Level 11 & Quot ;.
Esistono in realtà due classi, la seconda che estende la prima - android.text.ClipboardManager e android.content.ClipboardManager.
android.text.ClipboardManager esiste dall'API 1, ma funziona solo con il contenuto del testo.
android.content.ClipboardManager è il modo preferito di lavorare con gli appunti, ma non è disponibile a livello di API < 11 (Honeycomb).
Per ottenerne uno è necessario il seguente codice:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
Ma per API < 11 devi importare android.text.ClipboardManager
e per API & Gt; = 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());
}
puoi provare questo ..
Ecco del codice per implementare alcune funzioni di copia e incolla da EditText (grazie a Warpzit per il controllo della versione). Puoi agganciarli all'evento onclick del tuo pulsante.
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());
}
}
}
Aggiornamento della libreria di supporto Android
A partire da Android Oreo, la libreria di supporto scende solo all'API 14. Probabilmente la maggior parte delle app più recenti ha anche un'API minima di 14, quindi non è necessario preoccuparsi dei problemi con l'API 11 menzionati in alcuni degli altri risposte. Gran parte del codice può essere ripulito. (Ma vedi la mia cronologia delle modifiche se stai ancora supportando le versioni precedenti.)
Copia
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null) return;
clipboard.setPrimaryClip(clip);
Incolla
Sto aggiungendo questo codice come bonus, perché il copia / incolla viene solitamente eseguito in coppia.
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
return;
}
Note
- Assicurati di importare la
android.content.ClipboardManager
versione anziché la vecchiaandroid.text.ClipboardManager
. Lo stesso perClipData
. - Se non fai parte di un'attività, puoi ottenere il servizio con
context.getSystemService()
. - Ho usato un blocco try / catch per ottenere il testo incollato perché più cose possono essere
null
. Puoi controllare ognuno se lo trovi più leggibile.
Per abilitare la copia / incolla standard per TextView, U può scegliere una delle seguenti opzioni:
Modifica del file di layout: aggiungi la proprietà di seguito a TextView
android:textIsSelectable="true"
Nella tua classe Java scrivi questa riga due impostando grammaticalmente.
myTextView.setTextIsSelectable(true);
E premi a lungo su TextView puoi vedere la barra delle azioni di copia / incolla.
@FlySwat ha già dato la risposta corretta, sto solo condividendo la risposta completa:
Usa ClipboardManager.setPrimaryClip ( http://developer.android.com/ metodo di riferimento / android / content / ClipboardManager.html ):
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
Dove label
è un'etichetta visibile dall'utente per i dati della clip e
text
è il testo effettivo nella clip. Secondo documenti ufficiali .
È importante utilizzare questa importazione:
import android.content.ClipboardManager;
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);
E importa import android.content.ClipboardManager;