Copy to Clipboard Programmatically
Copy text to clipboard and paste from clipboard programmatically in Android using ClipboardManager and ClipData.
Android’s ClipboardManager lets you copy text (or other content) to the system clipboard and read it back. It’s useful for copy buttons, sharing text, or any feature where the user needs to reuse content.
Copy Text to Clipboard
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("label", "Text to copy")
clipboard.setPrimaryClip(clip)
That’s it — three lines. The label parameter is a user-visible label for the clip (most apps just pass a descriptive string).
Paste from Clipboard
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = clipboard.primaryClip
if (clip != null && clip.itemCount > 0) {
val pastedText = clip.getItemAt(0).text.toString()
// use pastedText
}
Always check for null and itemCount — the clipboard might be empty.
Complete Example
A simple app with an EditText, Copy button, Paste button, and a TextView to display pasted content.
MainActivity.kt
package com.pcsalt.example.clipboardmanager
import android.content.ClipData
import android.content.ClipboardManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.pcsalt.example.clipboardmanager.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
binding.btnCopy.setOnClickListener {
val text = binding.etInput.text.toString().trim()
if (text.isEmpty()) {
binding.etInput.error = "Enter text to copy"
return@setOnClickListener
}
val clip = ClipData.newPlainText("copied_text", text)
clipboard.setPrimaryClip(clip)
Toast.makeText(this, "Copied to clipboard", Toast.LENGTH_SHORT).show()
}
binding.btnPaste.setOnClickListener {
val clip = clipboard.primaryClip
if (clip != null && clip.itemCount > 0) {
val pastedText = clip.getItemAt(0).text.toString()
binding.tvPastedText.text = pastedText
} else {
Toast.makeText(this, "Clipboard is empty", Toast.LENGTH_SHORT).show()
}
}
}
}
Layout — activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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="16dp">
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter text to copy"
android:inputType="text" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnCopy"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="4dp"
android:text="Copy" />
<Button
android:id="@+id/btnPaste"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="4dp"
android:text="Paste" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Pasted text"
android:textAppearance="?attr/textAppearanceTitleMedium" />
<TextView
android:id="@+id/tvPastedText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textAppearance="?attr/textAppearanceBodyLarge" />
</LinearLayout>
Other ClipData Types
ClipData supports more than plain text:
// URI (e.g., content provider URI)
val clip = ClipData.newUri(contentResolver, "label", uri)
// Intent
val clip = ClipData.newIntent("label", intent)
// HTML text
val clip = ClipData.newHtmlText("label", "plain text fallback", "<b>HTML</b>")