Come si abilita il copia incolla standard per un TextView in Android?


119

Voglio abilitare il copia incolla standard per un TextView (lo stesso di EditText). Come posso farlo?

Ho provato a utilizzare un EditText non modificabile ma non ha funzionato bene (a volte è diventato modificabile o l'overlay copia incolla non è stato mostrato). E probabilmente non è un buon approccio in generale.

Serve una soluzione funzionante a partire dall'API 7.


È questo quello che stai cercando?
Jermin Bazazian

È simile, ma non uguale perché voglio copiare tutto il testo. Ma sembra lo stesso. Il problema è che la risposta lì funziona solo a partire dall'API 11 e ho bisogno di qualcosa che
funzioni

ClipboardManagerè disponibile dall'API 1 (guarda qui ). Che ne dici di premere a lungo, con un popup da copiare negli appunti?
Jermin Bazazian

@ Jermin Sì, sembra che devo creare una soluzione personalizzata.
Ixx

Risposte:


226

Prova android:textIsSelectable.

vale a dire, android:textIsSelectable="true"


Si può farlo per EditTextPreference?
polvere 366

1
@ powder366: penso che EditTextPreferencesupporti già il copia / incolla. Sicuramente sembra nell'app Impostazioni.
CommonsWare

In realtà sembra essere un bug. Viene visualizzato sul mio dispositivo Samsung 4.2.2. Nexus7 e Nexus10 funzionano. code.google.com/p/android/issues/detail?id=26008
powder366

Solo una nota su questo, se la tua visualizzazione del testo è inizialmente nascosta e la stai mostrando in modo programmatico usando setVisibility, allora devi usare textView.setTextIsSelectable (true) per farlo funzionare. In questo caso non funzionerà tramite xml.
Praveen Singh

58

Per abilitare il copia / incolla standard per TextView, puoi scegliere una delle seguenti:

  1. Modifica nel file di layout: aggiungi sotto la proprietà al tuo TextView

    android:textIsSelectable="true"

  2. Nella tua classe Java scrivi questa riga per impostarla a livello di programmazione. myTextView.setTextIsSelectable(true);

E premendo a lungo su TextView puoi vedere la barra delle azioni copia / incolla.


1
io faccio così. quando clicco sui testi, si apre la barra degli strumenti con i pulsanti "copia" e "seleziona tutti". ma dopo aver cliccato su di essi non succede nulla. cosa posso fare?
Mina Dahesh

2
Questa soluzione è migliore di quella contrassegnata come corretta con il segno di spunta verde.
Adam Hurwitz

21

Funziona per la copia pre-Honeycomb:

import android.text.ClipboardManager;

textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ClipboardManager cm = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
        cm.setText(textView.getText());
        Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show();
    }
});

4
Una buona strategia sarebbe quella di utilizzare questo insieme alla risposta di CommonsWare. Dal momento che l'aggiunta di android:textIsSelectablevite nel layout, verrà semplicemente ignorata ai livelli API inferiori. Quindi utilizzare la soluzione di Ixx all'interno di un'istruzione if che verifica se il livello API è inferiore a 11. Il meglio di entrambi i mondi. La cosa bella android:textIsSelectableè che ti dà la barra delle azioni di selezione del testo della piattaforma e ha una bella sensazione nativa.
emil10001

1
Il metodo setText (CharSequence) dal tipo ClipboardManager è deprecato
S.M_Emamian

1
Sì, beh, questa risposta è di più di 2 anni fa. Sentiti libero di modificarne o aggiungerne uno nuovo.
Ixx

11

Richiede API 11 , codice aggiornato, il metodo precedente è deprecato

Soluzione per il tema a schermo intero senza ActionBar

Estendi TextViewe nel costruttore incolla il codice seguente

this.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                ClipboardManager cManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData cData = ClipData.newPlainText("text", getText());
                cManager.setPrimaryClip(cData);
                Util.toast(mContext, string.text_copyed);
                return true;
            }
        });

9

In xml textview incolla questo codice

android:textIsSelectable="true"

Quindi nel file java,

 final TextView txtcopypaste = findViewById(R.id.txtcopypaste); // my textview
    txtcopypaste.setOnClickListener(new View.OnClickListener() { // set onclick listener to my textview
        @Override
        public void onClick(View view) {
            ClipboardManager cm = (ClipboardManager)getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
            cm.setText(txtcopypaste.getText().toString());              
            Toast.makeText(getApplicationContext(), "Copied :)", Toast.LENGTH_SHORT).show();
        }
    });

Requisito: è necessario copiare e incollare il testo che si trova nella visualizzazione di testo.

OutCome: utilizzando la visualizzazione del testo, una volta che ho fatto clic sulla visualizzazione del testo. Viene automaticamente copiato il testo che si trova nella visualizzazione testo.

Nota: durante l'importazione di clipboardmanager prova a preferire

Si prega di preferire il gestore degli appunti di testo

import android.text.ClipboardManager; // prefer this 

cerca di evitare il gestore degli appunti di contenuto

import android.content.ClipboardManager; // Not this

3
  1. usa il tema

    @android:style/Theme.Black.NoTitleBar.Fullscreen

    o

    @android:style/Theme.WithActionBar
  2. imposta TextView in xml

    android:textIsSelectable="true"
  3. vedere il risultato


3

se qualcuno vuole fare il possibile e seleziona e copia negli appunti con un clic:

 phone.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                            ClipData clip = ClipData.newPlainText("PhoneNumber", phone.getText());
                            clipboard.setPrimaryClip(clip);

                        }
                    });

phone è TextView e phone.Text è il testo che verrà copiato negli appunti.


0

questo è meglio:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}

-2

Per un EditText, in manifest all'interno dell'attività utilizzare android:windowSoftInputMode="adjustResize"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.