Android Studio: буфер обмена с ClipboardManager. Урок на Kotlin.

Копирование текста в буфер и его вставка — одно из самых частых действий, которые пользователи выполняют на смартфоне. Приложения могут облегчить эту задачу, добавив кнопку «Скопировать» или автоматически вставляя нужные данные в поле ввода. Сегодня на занятии в Android Studio мы разберём, как управлять буфером обмена через системный сервис ClipboardManager. Писать будем на Kotlin, и этот урок покажет, как реализовать копирование и вставку текста в несколько строк.


Что такое ClipboardManager

ClipboardManager — это системный сервис, который управляет содержимым буфера обмена. Он позволяет поместить туда текст, а затем извлечь его откуда угодно в пределах приложения или даже между разными программами. С точки зрения кода всё просто: получаем экземпляр менеджера, создаём объект ClipData с нужным текстом и передаём его в буфер. Для чтения — запрашиваем текущий ClipData и, если он содержит текст, извлекаем его.

Никаких разрешений в манифесте не требуется — буфер обмена доступен любому приложению без ограничений. Единственный нюанс: пользователь может очистить буфер в любой момент, поэтому всегда проверяйте, что в нём действительно лежит текст.


Разметка для примера

Создадим простой экран с полем ввода EditText и двумя кнопками: «Копировать» и «Вставить». Корневой контейнер — LinearLayout с вертикальной ориентацией.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="24dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Введите текст" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="16dp">

        <Button
            android:id="@+id/btnCopy"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Копировать" />

        <Button
            android:id="@+id/btnPaste"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Вставить" />
    </LinearLayout>
</LinearLayout>

Копируем текст в буфер обмена

В MainActivity.kt получим ссылки на элементы и настроим обработку нажатий. Для копирования берём текст из EditText и передаём его в ClipboardManager.

class MainActivity : AppCompatActivity() {
    private lateinit var clipboardManager: ClipboardManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

        val editText = findViewById<EditText>(R.id.editText)
        val btnCopy = findViewById<Button>(R.id.btnCopy)
        val btnPaste = findViewById<Button>(R.id.btnPaste)

        btnCopy.setOnClickListener {
            val text = editText.text.toString()
            if (text.isNotEmpty()) {
                val clipData = ClipData.newPlainText("label", text)
                clipboardManager.setPrimaryClip(clipData)
                Toast.makeText(this, "Скопировано в буфер", Toast.LENGTH_SHORT).show()
            }
        }

        btnPaste.setOnClickListener {
            val clipData = clipboardManager.primaryClip
            if (clipData != null && clipData.itemCount > 0) {
                val pastedText = clipData.getItemAt(0).text.toString()
                editText.setText(pastedText)
                Toast.makeText(this, "Вставлено из буфера", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Буфер пуст", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

Метод newPlainText создаёт объект ClipData для простого текста. Первый параметр — метка, которая обычно не отображается, второй — сам текст. При вставке мы проверяем, есть ли в буфере хотя бы один элемент, и извлекаем его.


Копирование без EditText

Иногда нужно скопировать заранее заданную строку, например, промокод или номер кошелька. Тогда текст берётся не из поля ввода, а напрямую из переменной.

btnCopyCode.setOnClickListener {
    val promoCode = "SUMMER2025"
    val clipData = ClipData.newPlainText("promo", promoCode)
    clipboardManager.setPrimaryClip(clipData)
    Toast.makeText(this, "Промокод скопирован", Toast.LENGTH_SHORT).show()
}

Использование с Jetpack Compose

Если интерфейс построен на Compose, доступ к ClipboardManager можно получить через LocalClipboardManager.current. Это обёртка над системным сервисом, которая работает одинаково на всех версиях Android.

@Composable
fun ClipboardExample() {
    val clipboardManager = LocalClipboardManager.current
    var text by remember { mutableStateOf("") }

    Column(modifier = Modifier.padding(24.dp)) {
        OutlinedTextField(value = text, onValueChange = { text = it })

        Button(onClick = {
            clipboardManager.setText(AnnotatedString(text))
        }) {
            Text("Копировать")
        }

        Button(onClick = {
            val clipText = clipboardManager.getText()?.text ?: ""
            text = clipText
        }) {
            Text("Вставить")
        }
    }
}

Полезные советы

  • Проверяйте тип данных в буфере. Кроме текста в буфере могут быть URI, изображения и другие типы. Если ожидаете только текст, проверяйте clipData.getItemAt(0).text на null.
  • Не храните пароли в буфере долго. Буфер обмена — общедоступное хранилище. На Android 10+ система предупреждает, если приложение читает буфер без ведома пользователя, но лучше не копировать туда чувствительные данные.
  • Добавляйте визуальную обратную связь. Показывайте Toast или меняйте цвет кнопки после копирования — пользователь должен понимать, что действие выполнено.

Что мы освоили

Сегодняшний урок в Android Studio на языке Kotlin показал, как управлять буфером обмена через ClipboardManager. Вы научились копировать текст в буфер, извлекать его оттуда и реализовали удобные кнопки «Копировать» и «Вставить». Теперь ваше приложение может помочь пользователю быстро делиться информацией или вставлять сохранённые ранее данные. Попробуйте добавить автоматическое копирование результата вычислений — это займёт несколько минут и сделает интерфейс ещё практичнее.

Яндекс.Метрика