Jak włączyć standardowe wklejanie kopii dla TextView w systemie Android?

119

Chcę włączyć standardowe kopiowanie wklejania dla TextView (tak samo jak w przypadku EditText). Jak mogę to zrobić?

Próbowałem użyć nieedytowalnego EditText, ale nie działało to dobrze (czasami można go było edytować lub nakładka kopiowania wklejania nie była wyświetlana). I prawdopodobnie nie jest to ogólnie dobre podejście.

Potrzebujesz działającego rozwiązania zaczynającego się od API 7.

Ixx
źródło
Czy tego szukasz?
Jermin Bazazian
Jest podobnie, ale nie to samo, ponieważ chcę skopiować cały tekst. Ale wygląda tak samo. Problem w tym, że odpowiedź tam działa tylko zaczynając od API 11 i potrzebuję czegoś, co działa z API 7.
Ixx
ClipboardManagerjest dostępny od API 1 (patrz tutaj ). Co powiesz na długie naciśnięcie z wyskakującym okienkiem do skopiowania do schowka?
Jermin Bazazian
@Jermin Tak, wygląda na to, że muszę stworzyć niestandardowe rozwiązanie.
Ixx

Odpowiedzi:

226

Spróbuj android:textIsSelectable.

to znaczy, android:textIsSelectable="true"

CommonsWare
źródło
Czy można to zrobić dla EditTextPreference?
proszek366
1
@ powder366: Myślę, że to EditTextPreferencejuż obsługuje kopiowanie / wklejanie. Z pewnością wydaje się, że tak jest w aplikacji Ustawienia.
CommonsWare,
Właściwie wydaje się, że to błąd. Pojawia się na moim urządzeniu Samsung 4.2.2. Nexus7 i Nexus10 działają. code.google.com/p/android/issues/detail?id=26008
powder366
Tylko uwaga na ten temat, jeśli twój widok tekstu jest początkowo ukryty i pokazujesz go programowo za pomocą setVisibility, musisz użyć textView.setTextIsSelectable (true), aby to zadziałało. W takim przypadku nie będzie działać przez XML.
Praveen Singh
58

Aby włączyć standardowe kopiowanie / wklejanie dla TextView, możesz wybrać jedną z następujących opcji:

  1. Zmiana w pliku układu: dodaj poniższą właściwość do swojego TextView

    android:textIsSelectable="true"

  2. W swojej klasie Java napisz tę linię, aby ustawić ją programowo. myTextView.setTextIsSelectable(true);

I długo naciśnij TextView, aby zobaczyć pasek akcji kopiowania / wklejania.

RamiReddy
źródło
1
tak robię. kiedy klikam tekst, pasek narzędzi z otwartymi przyciskami „kopiuj” i „wybierz wszystkie”. ale po kliknięciu nic się nie dzieje. co mogę zrobić?
Mina Dahesh
2
To rozwiązanie jest lepsze niż to, które zaznaczono jako poprawne zielonym haczykiem.
Adam Hurwitz
21

Działa to w przypadku kopiowania przed plastrem miodu:

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
źródło
4
Dobrą strategią byłoby użycie tego razem z odpowiedzią CommonsWare. Ponieważ dodawanie android:textIsSelectableżyć w układzie, zostanie po prostu zignorowane na niższych poziomach interfejsu API. Następnie użyj rozwiązania Ixx w instrukcji if, która sprawdza, czy poziom API jest poniżej 11. Najlepsze z obu światów. Zaletą android:textIsSelectablejest to, że daje ci pasek akcji wyboru tekstu platformy i ma przyjemne natywne uczucie.
emil10001,
1
Metoda setText (CharSequence) z typu ClipboardManager jest przestarzała
S.M_Emamian,
1
Tak, cóż, ta odpowiedź pochodzi sprzed ponad 2 lat. Zapraszam do edytowania lub dodawania nowego.
Ixx
11

Wymaga interfejsu API 11 , zaktualizowanego kodu, poprzednia metoda jest przestarzała

Rozwiązanie dla motywu na pełnym ekranie bez ActionBar

Rozszerz TextViewiw konstruktorze wklej następujący kod

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_
źródło
9

W XML Textview wklej ten kod

android:textIsSelectable="true"

Następnie w pliku 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();
        }
    });

Warunek: należy skopiować i wkleić tekst znajdujący się w widoku tekstu.

OutCome: Używając widoku tekstowego , kiedy kliknąłem widok tekstu. Automatycznie skopiował tekst, który jest w widoku tekstu.

Uwaga: podczas importowania clipboardmanager spróbuj preferować

Proszę preferować menedżera schowka tekstowego

import android.text.ClipboardManager; // prefer this 

staraj się unikać menedżera schowka treści

import android.content.ClipboardManager; // Not this
Agilanbu
źródło
3
  1. użyj motywu

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

    lub

    @android:style/Theme.WithActionBar
  2. ustaw TextView w xml

    android:textIsSelectable="true"
  3. zobacz wynik

Michael Mao
źródło
3

jeśli ktoś chce pójść o krok dalej i jednym kliknięciem wybrać i skopiować do schowka:

 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 to TextView, a phone.Text to tekst, który zostanie skopiowany do schowka.

narcis dpr
źródło
0

tak jest lepiej:

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
źródło
-2

W przypadku EditTextmanifestacji wewnątrz działania użyj android:windowSoftInputMode="adjustResize"

rajeesh
źródło