Як увімкнути стандартну пасту для копіювання TextView в Android?


119

Я хочу включити стандартну папку для копіювання для TextView (те саме, що і для EditText). Як я можу це зробити?

Я спробував скористатися EditText, який не можна редагувати, але він не спрацював (іноді він став редагованим або накладка копіювальної пасти не показана). І, мабуть, це не дуже вдалий підхід.

Потрібно робоче рішення, починаючи з API 7.


Є чи це те , що ви шукаєте?
Джермін Базазіян

Це схоже, але не те саме, тому що я хочу скопіювати весь текст. Але це виглядає так само. Проблема полягає в тому, що відповідь там працює лише з API 11, і мені потрібно щось, що працює від API 7.
Ixx

ClipboardManagerдоступний з API 1 (дивіться тут ). Як щодо тривалого натискання із спливаючим вікном для копіювання у буфер обміну?
Джермін Базазіян

@Jermin Так, здається, я повинен зробити власні рішення.
Ixx

Відповіді:


226

Спробуйте android:textIsSelectable.

тобто android:textIsSelectable="true"


Чи можна це зробити для EditTextPreference?
порошок366

1
@ powder366: Я думаю, що EditTextPreferenceвже підтримує копіювати / вставляти. Це, звичайно, здається в додатку Налаштування.
CommonsWare

Насправді це здається помилкою. Показується на моєму пристрої Samsung 4.2.2. Працюють Nexus7 і Nexus10. code.google.com/p/android/isissue/detail?id=26008
powder366

Лише зауваження щодо цього, якщо ваш текстовий вигляд спочатку прихований і ви його програмно показуєте за допомогою setVisibility, тоді вам потрібно використовувати textView.setTextIsSelectable (true), щоб зробити цю роботу. У цьому випадку він не працюватиме через xml.
Praveen Singh

58

Щоб увімкнути стандартну копію / вставити для TextView, U може вибрати одне з наступних:

  1. Зміна файлу компонування: додайте нижче властивість до TextView

    android:textIsSelectable="true"

  2. У вашому класі Java напишіть цей рядок, щоб встановити його програмно. myTextView.setTextIsSelectable(true);

Якщо натиснути на TextView, натисніть на панель дій для копіювання та вставки.


1
я так роблю. коли я натискаю на тексти панель інструментів із кнопками "копіювати" та "вибирати аль" l, відкриваються кнопки. але після того, як я натискаю на них, нічого не відбувається. що я можу зробити?
Міна Даеш

2
Це рішення краще, ніж те, що позначено правильним зеленою галочкою.
Адам Гурвіц

21

Це працює для копіювання попереднього стільника:

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
Гарною стратегією було б використовувати це разом із відповіддю CommonsWare. Оскільки додається android:textIsSelectableжиття в макет, воно буде просто ігноруватися на нижчих рівнях API. Потім використовуйте рішення Ixx в операторі if, який перевіряє, чи рівень API нижче 11. Кращий з обох світів. Приємно в тому android:textIsSelectable, що він дає вам панель дій з вибору тексту платформи та має гарне відчуття рідного.
emil10001

1
Метод setText (CharSequence) від типу ClipboardManager застарілий
S.M_Emamian

1
Так, добре, ця відповідь є більш ніж 2 роки тому. Не соромтесь редагувати або додавати нове.
Ixx

11

Потрібен API 11 , оновлений код, попередній метод застарілий

Рішення для теми на весь екран без ActionBar

Розгорніть TextViewі вставте конструктор наступного коду

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

У текстовий перегляд xml вставте цей код

android:textIsSelectable="true"

Потім у файлі 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();
        }
    });

Вимога: Необхідно скопіювати та вставити текст, який знаходиться у текстовому перегляді.

OutCome: Використовуючи перегляд тексту, одного разу я натиснув перегляд тексту. Його автоматично копіюється текст, який знаходиться в текстовому перегляді.

Примітка. Під час імпорту буфера обміну менеджер намагається віддати перевагу

Будь ласка, віддайте перевагу менеджеру буфера обміну текстом

import android.text.ClipboardManager; // prefer this 

намагайтеся уникати менеджера буфера обміну вмістом

import android.content.ClipboardManager; // Not this

3
  1. використовувати тему

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

    або

    @android:style/Theme.WithActionBar
  2. встановити TextView в xml

    android:textIsSelectable="true"
  3. побачити результат


3

якщо хтось хоче пройти зайву милю і виконати вибір і скопіювати у буфер обміну одним клацанням миші:

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

                        }
                    });

телефон - це TextView, а телефон. Текст - це Текст, який буде скопійовано у буфер обміну.


0

це краще:

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

Для EditText, в маніфесті всередині діяльності використання android:windowSoftInputMode="adjustResize"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.