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.


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"


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.


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();
    }
});

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;
            }
        });

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

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


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.


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");
}

-2

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.