Como faço para habilitar o copiar e colar padrão para um TextView no Android?

119

Desejo ativar a cópia e colagem padrão para um TextView (o mesmo que para EditText). Como eu posso fazer isso?

Tentei usar um EditText não editável, mas não funcionou bem (às vezes se tornava editável ou a sobreposição de copiar e colar não era exibida). E provavelmente não é uma boa abordagem em geral.

Precisa de uma solução funcional a partir da API 7.

Ixx
fonte
É isso que você está procurando?
Jermin Bazazian
É semelhante, mas não é o mesmo porque quero copiar todo o texto. Mas parece o mesmo. O problema é que a resposta lá só funciona a partir da API 11 e preciso de algo que funcione a partir da API 7.
Ixx
ClipboardManagerestá disponível desde a API 1 (veja aqui ). Que tal pressionar longamente, com um pop-up para copiar para a área de transferência?
Jermin Bazazian
@Jermin Sim, parece que tenho que fazer uma solução customizada.
Ixx

Respostas:

226

Experimente android:textIsSelectable.

ou seja, android:textIsSelectable="true"

CommonsWare
fonte
Pode-se fazer isso para EditTextPreference?
powder366,
1
@ powder366: Acho que EditTextPreferencejá suporta copiar / colar. Certamente parece que no aplicativo Configurações.
CommonsWare
Na verdade, parece ser um bug. Aparece no meu dispositivo Samsung 4.2.2. Nexus7 e Nexus10 funcionam. code.google.com/p/android/issues/detail?id=26008
powder366
Apenas uma observação sobre isso, se sua visualização de texto estiver inicialmente oculta e você a estiver mostrando programaticamente usando setVisibility, então você precisa usar textView.setTextIsSelectable (true) para fazer isso funcionar. Não funcionará via xml nesse caso.
Praveen Singh
58

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

  1. Mudança no arquivo de layout: adicione a propriedade abaixo ao seu TextView

    android:textIsSelectable="true"

  2. Em sua classe Java, escreva esta linha para defini-la programaticamente. myTextView.setTextIsSelectable(true);

E mantenha pressionado o TextView para ver a barra de ação copiar / colar.

RamiReddy
fonte
1
eu faço isso. quando clico nos textos, a barra de ferramentas com os botões "copiar" e "selecionar todos" se abre. mas depois de clicar neles, nada acontece. o que eu posso fazer?
Mina Dahesh
2
Esta solução é melhor do que aquela marcada como correta com a marca de seleção verde.
Adam Hurwitz
21

Isso funciona para a cópia pré-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();
    }
});
Ixx
fonte
4
Uma boa estratégia seria usar isso junto com a resposta do CommonsWare. Como adicionar android:textIsSelectablevidas no layout, ele será simplesmente ignorado em níveis de API inferiores. Em seguida, use a solução de Ixx em uma instrução if que verifica se o nível da API está abaixo de 11. O melhor dos dois mundos. O bom android:textIsSelectabledisso é que ele fornece a barra de ação de seleção de texto da plataforma e tem um bom sentimento nativo.
emil10001
1
O método setText (CharSequence) do tipo ClipboardManager está obsoleto
S.M_Emamian
1
Sim, bem, esta resposta é de mais de 2 anos atrás. Sinta-se à vontade para editar ou adicionar um novo.
Ixx
11

Requer API 11 , código atualizado, o método anterior está obsoleto

Solução para tema em tela cheia sem ActionBar

Estenda TextViewe cole no construtor o seguinte código

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;
            }
        });
AZ_
fonte
9

Em xml textview cole este código

android:textIsSelectable="true"

Então, em arquivo 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: precisa copiar e colar o texto que está na textview.

OutCome: Usando textview, uma vez que cliquei no textview. É copiado automaticamente o texto que está na visualização de texto.

Nota: Ao importar o gerenciador da área de transferência, tente preferir

Por favor, prefira o gerenciador de área de transferência de texto

import android.text.ClipboardManager; // prefer this 

tente evitar o gerenciador de área de transferência de conteúdo

import android.content.ClipboardManager; // Not this
Agilanbu
fonte
3
  1. usar tema

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

    ou

    @android:style/Theme.WithActionBar
  2. definir TextView em xml

    android:textIsSelectable="true"
  3. veja o resultado

Michael Mao
fonte
3

se alguém quiser ir além e selecionar e copiar para a área de transferência com um clique:

 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 é o TextView e phone.Text é o Texto que será copiado para a área de transferência.

narcis dpr
fonte
0

isto é melhor:

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");
}
Beeing Jk
fonte
-2

Para um EditText, em manifesto dentro da atividade, use android:windowSoftInputMode="adjustResize"

Rajeesh
fonte