Sto creando un'app Android e voglio copiare il valore di testo di un widget EditText. È possibile per l'utente premere Menu+A
quindiMenu+C
per copiare il valore, ma come lo farei a livello di codice?
Sto creando un'app Android e voglio copiare il valore di testo di un widget EditText. È possibile per l'utente premere Menu+A
quindiMenu+C
per copiare il valore, ma come lo farei a livello di codice?
Risposte:
Utilizzare il ClipboardManager#setPrimaryClip
metodo:
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();
Quindi tutti sono d'accordo su come farlo, ma poiché nessuno vuole dare una soluzione completa, ecco qui:
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 dichiarato qualcosa di simile in manifest:
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
label
in newPlainText
metodo? afferma il documentaion label User-visible label for the clip data.
. Ma quando è label
visibile all'utente? E che tipo di valore / nome dovrei inserire label
?
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 dice "Da: API Level 11".
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 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> = 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());
}
}
}
A partire da Android Oreo, la libreria di supporto scende solo all'API 14. La maggior parte delle app più recenti probabilmente hanno anche un'API minima di 14, quindi non è necessario preoccuparsi dei problemi con l'API 11 menzionati in alcune delle altre risposte. Gran parte del codice può essere ripulito. (Ma vedi la mia cronologia delle modifiche se stai ancora supportando le versioni precedenti.)
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);
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;
}
android.content.ClipboardManager
versione anziché la vecchia android.text.ClipboardManager
. Lo stesso perClipData
.context.getSystemService()
.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 operazioni di copia / incolla.
@FlySwat ha già dato la risposta corretta, sto solo condividendo la risposta completa:
Utilizzare il metodo 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);
Dove si label
trova un'etichetta visibile dall'utente per i dati della clip ed
text
è il testo effettivo nella clip. Secondo i documenti ufficiali .
È importante utilizzare questa importazione:
import android.content.ClipboardManager;
Ecco il mio codice di lavoro
/**
* 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);
}
}
Per Kotlin, possiamo usare il seguente metodo. È possibile incollare questo metodo all'interno di un'attività o di un frammento.
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 la parte che mi mancava - potrebbe essere perché lo sto facendo all'interno di un frammento.