이 튜토리얼에서는 안드로이드 앱에서 EditText 위젯의 복사/잘라내기/붙여넣기 기능을 비활성화하는 방법을 단계별로 알아봅니다. 사용자가 입력 필드의 텍스트를 임의로 복사하거나 외부 내용을 붙여넣지 못하도록 제어해야 하는 경우에 유용하게 활용할 수 있습니다.
핵심 원리: setCustomSelectionActionModeCallback()
EditText에서 텍스트를 길게 누르면 시스템이 ActionMode(텍스트 선택 툴바)를 생성하며, 여기에 잘라내기·복사·붙여넣기 메뉴가 나타납니다. 이 ActionMode의 콜백을 커스터마이징하여 onCreateActionMode()에서 false를 반환하면 해당 메뉴 자체가 생성되지 않아 복사/붙여넣기를 사실상 차단할 수 있습니다.
1단계 — 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.
2단계 — 레이아웃 작성 (res/layout/activity_main.xml)
아래 코드를 res/layout/activity_main.xml 파일에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<TextView
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="22sp"
android:textStyle="bold"
android:layout_centerHorizontal="true"
android:text="Cut/copy/paste is Disabled" />
<EditText
android:id="@+id/editText"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
3단계 — MainActivity 구현 (src/MainActivity.java)
setCustomSelectionActionModeCallback()을 사용해 텍스트 선택 시 나타나는 ActionMode 메뉴가 만들어지지 않도록 처리합니다.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// ActionMode(복사/붙여넣기 메뉴) 생성을 차단
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// 필요한 정리 작업이 있다면 여기서 처리
}
});
}
}
4단계 — 매니페스트 설정 (androidManifest.xml)
아래 코드를 androidManifest.xml에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
앱 실행 및 결과 확인
실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 Android Studio 툴바의 Run 버튼을 클릭해 앱을 실행합니다. 실행 옵션으로 연결된 모바일 기기를 선택하면, 기본 화면이 아래와 같이 표시됩니다.

앱이 실행되면 EditText를 길게 눌러도 잘라내기·복사·붙여넣기 메뉴가 나타나지 않는 것을 확인할 수 있습니다.
추가 팁: 더 강력한 차단 방법
위 방법만으로는 일부 기기나 롱프레스 이벤트를 우회하는 동작까지 완벽히 막기 어려울 수 있습니다. 다음 방법을 함께 적용하면 더 확실합니다.
- 롱클릭 비활성화:
editText.setLongClickable(false);를 호출하면 텍스트 선택 자체가 발생하지 않습니다. - 붙여넣기 차단:
onTextContextMenuItem()을 오버라이드하여android.R.id.paste항목일 때true를 반환하면 붙여넣기 이벤트를 가로챌 수 있습니다. - 클립보드 감시: API 29(Android 10)부터는 백그라운드 앱의 클립보드 접근이 제한되므로, 최신 OS 환경에서는 시스템 차원에서도 일부 제어가 가능합니다.
이처럼 setCustomSelectionActionModeCallback()과 함께 보조적인 처리를 조합하면, EditText의 복사/붙여넣기를 목적에 맞게 효과적으로 제어할 수 있습니다.