Копирование текста в буфер и его вставка — одно из самых частых действий, которые пользователи выполняют на смартфоне. Приложения могут облегчить эту задачу, добавив кнопку «Скопировать» или автоматически вставляя нужные данные в поле ввода. Сегодня на занятии в 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. Вы научились копировать текст в буфер, извлекать его оттуда и реализовали удобные кнопки «Копировать» и «Вставить». Теперь ваше приложение может помочь пользователю быстро делиться информацией или вставлять сохранённые ранее данные. Попробуйте добавить автоматическое копирование результата вычислений — это займёт несколько минут и сделает интерфейс ещё практичнее.