Как включить стандартную копировальную пасту для 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?
Powder366 09

1
@ Powder366: я бы подумал, что он EditTextPreferenceуже поддерживает копирование / вставку. Кажется, что в приложении "Настройки".
CommonsWare

На самом деле это похоже на ошибку. Отображается на моем устройстве Samsung 4.2.2. Nexus7 и Nexus10 работает. code.google.com/p/android/issues/detail?id=26008
Powder366, 09

Просто обратите внимание на это, если ваше текстовое представление изначально скрыто и вы показываете его программно с помощью setVisibility, вам нужно использовать textView.setTextIsSelectable (true), чтобы это работало. В этом случае он не будет работать через xml.
Правин Сингх

58

Чтобы включить стандартное копирование / вставку для TextView, U может выбрать одно из следующего:

  1. Изменение в файле макета: добавьте свойство ниже в свой TextView

    android:textIsSelectable="true"

  2. В вашем классе Java напишите эту строку, чтобы установить ее программно. myTextView.setTextIsSelectable(true);

При длительном нажатии на TextView вы увидите панель действий копирования / вставки.


1
я так и делаю. когда я нажимаю на текст, открывается панель инструментов с кнопками «копировать» и «выбрать все». но после того, как я нажимаю на них, ничего не происходит. Что я могу сделать?
Мина Дахеш

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
Да, ну, это ответ более двух лет назад. Не стесняйтесь редактировать или добавлять новые.
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 textview вставьте этот код

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: использование текстового просмотра, как только я щелкнул текстовое представление. Он автоматически скопировал текст, который находится в текстовом окне.

Примечание: при импорте clipboardmanager старайтесь

Пожалуйста, предпочитайте менеджер текстового буфера обмена

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

                        }
                    });

phone - это TextView, а phone.Text - это текст, который будет скопирован в буфер обмена.


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.