Android 앱에서 프로그래밍 방식으로 텍스트를 복사하는 방법은 무엇입니까?


231

Android 앱을 만들고 있는데 EditText 위젯의 텍스트 값을 복사하고 싶습니다. 사용자가 누른 Menu+A다음 을 눌러 Menu+C값을 복사 할 수 있지만 프로그래밍 방식으로 어떻게해야합니까?



: 이것은 기본적으로의 중복 질문 stackoverflow.com/a/13517876/2116185
user2116185

답변:


419

사용 ClipboardManager#setPrimaryClip방법 :

import android.content.ClipboardManager;

// ...

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip);

ClipboardManager API 참조


7
사용import android.content.ClipboardManager;
MatheusJardimB

이 기능은 API 11+ (롤리팝 포함)에서 작동합니까?
Ashraf Alshahawy

22
무엇입니까 label?
Alaa M.

클립 트레이가 나타나지 않고이 작업을 수행 할 수 있습니까? (LG G4S 5.1.1)
Alaa M.

2
복사 후 성공 메시지를 추가하여 사용자에게 텍스트가 복사되었음을 알릴 수 있습니다Context context = getApplicationContext(); Toast.makeText(context, "text copied", Toast.LENGTH_LONG).show();
Shady Sherif

217

따라서 모든 사람들이 이것이 어떻게 수행되어야하는지에 동의하지만 아무도 완벽한 솔루션을 제공하기를 원하지 않기 때문에 다음과 같습니다.

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    clipboard.setText("text to clip");
} else {
    android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
    android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip");
    clipboard.setPrimaryClip(clip);
}

매니페스트에 다음과 같은 선언이 있다고 가정합니다.

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />

컴파일러에서 오류가 발생하기 때문에 작동하지 않습니다. 호출에는 API 레벨 11 (현재 최소값은 7)이 필요합니다. android.content.ClipboardManager # setPrimaryClip line 245 Android Lint Problem.
JavaRunner

2
매니페스트에 target 및 min sdk를 추가 했습니까? 그렇다면 보푸라기 경고를 비활성화하십시오.
Warpzit

4
메소드 위에 @SuppressLint ({ "NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ( "deprecation"), @TargetApi (11) 3 줄을 추가하십시오 ........ 그것이 내가 한 일이며 작동합니다.
RRTW

2
사람이 정확히의 사용이 무엇인지 말씀 해주십시오 수 label있는 newPlainText방법은? 문서 상태 label User-visible label for the clip data.. 그러나 언제 label사용자에게 표시됩니까? 그리고 어떤 종류의 가치 / 이름을 넣어야 label합니까?
shadyinside

@tannerjohn 내 추측은 어딘가에 사용되는 일종의 미리보기입니다. 그러나 나는 어디에 있는지 모른다. 그러나 당신은 같은 텍스트를 두 번 사용할 수 있습니다 ...
Warpzit

15

인터넷 검색은 android.content.ClipboardManager로 연결되며 문서 페이지에 "Since : API Level 11"이라고 표시되어 있기 때문에 API <11에서 클립 보드를 사용할 수 없음을 결정할 수 있습니다.

실제로 두 개의 클래스가 있는데, 두 번째 클래스는 첫 번째 클래스 인 android.text.ClipboardManager와 android.content.ClipboardManager입니다.

android.text.ClipboardManager는 API 1부터 존재하지만 텍스트 내용에서만 작동합니다.

android.content.ClipboardManager는 클립 보드 작업에 선호되는 방법이지만 API 레벨 <11 (Honeycomb)에서는 사용할 수 없습니다.

그들 중 하나를 얻으려면 다음 코드가 필요합니다.

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

그러나 API <11의android.text.ClipboardManager 경우 가져와 API> = 11 을 가져와야합니다. android.content.ClipboardManager


14
public void onClick (View v) 
{
    switch (v.getId())
    {
        case R.id.ButtonCopy:
            copyToClipBoard();
            break;
        case R.id.ButtonPaste:
            pasteFromClipBoard();
            break;
        default:
            Log.d(TAG, "OnClick: Unknown View Received!");
            break;
    }
}

// Copy EditCopy text to the ClipBoard
private void copyToClipBoard() 
{
    ClipboardManager clipMan = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    clipMan.setPrimaryClip(editCopy.getText());
}

당신은 이것을 시도 할 수 있습니다 ..


8

다음은 EditText에서 복사 및 붙여 넣기 기능을 구현하는 코드입니다 (버전 확인을 위해 Warpzit에 감사함). 이것들을 버튼의 onclick 이벤트에 연결할 수 있습니다.

public void copy(View v) {      
    int startSelection = txtNotes.getSelectionStart();
    int endSelection = txtNotes.getSelectionEnd();      
    if ((txtNotes.getText() != null) && (endSelection > startSelection ))
    {
        String selectedText = txtNotes.getText().toString().substring(startSelection, endSelection);                
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(selectedText);
        } else {
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 
            android.content.ClipData clip = android.content.ClipData.newPlainText("WordKeeper",selectedText);
            clipboard.setPrimaryClip(clip);
        }
    }
}   

public void paste(View v) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), clipboard.getText());
        }
    } else {
        android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        android.content.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
        if (item.getText() != null) {
            txtNotes.getText().insert(txtNotes.getSelectionStart(), item.getText());
        }
    }
}

당신이하는 것처럼 작성하지 않고 안드로이드의 복사 / 붙여 넣기 / 잘라 내기 메소드를 호출 할 수 없습니까? 사용자가 선택한 텍스트를 굵게 / 이탈리아 / 밑줄 등으로 만들 수있는 기능이있는 사용자 지정 텍스트 선택 도구 모음을 만들었지 만 사용자 지정 후 기본 기능 복사 / 붙여 넣기 / 잘라내 기가 더 이상 작동하지 않지만 아이콘은 여전히 나타납니다?

"WordKeeper"란 무엇입니까?
안드로이드 개발자

7

안드로이드 지원 라이브러리 업데이트

Android Oreo에서 지원 라이브러리는 API 14로만 내려갑니다. 대부분의 최신 앱은 아마도 최소 API가 14이므로 다른 답변에서 언급 한 API 11의 문제에 대해 걱정할 필요가 없습니다. 많은 코드를 정리할 수 있습니다. (하지만 여전히 낮은 버전을 지원하는 경우 편집 내역을 참조하십시오.)

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", selectedText);
if (clipboard == null || clip == null) return;
clipboard.setPrimaryClip(clip);

복사 / 붙여 넣기는 일반적으로 쌍으로 이루어지기 때문에이 코드를 보너스로 추가하고 있습니다.

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
try {
    CharSequence text = clipboard.getPrimaryClip().getItemAt(0).getText();
} catch (Exception e) {
    return;
}

노트

  • android.content.ClipboardManager이전 버전이 아닌 버전 을 가져와야합니다 android.text.ClipboardManager. 동일ClipData .
  • 활동 중이 아닌 경우 서비스를받을 수 있습니다 context.getSystemService() .
  • 여러 가지 일 수 있기 때문에 붙여 넣기 텍스트를 얻기 위해 try / catch 블록을 사용했습니다 null. 더 읽기 쉬운 방법을 찾으면 각각을 확인할 수 있습니다.

1
"텍스트 레이블"은 무엇입니까?
안드로이드 개발자

@androiddeveloper, 나는 실제로 아무것도 라벨을 사용한 적이 없지만 이 Q & A를 참조하십시오 .
Suragch

따라서 사용자에게 표시되지만 실제로는 그렇지 않으며 개발자가 필요에 따라 사용하도록 결정합니다.
안드로이드 개발자

5

TextView에 대한 표준 복사 / 붙여 넣기를 활성화하기 위해 U는 다음 중 하나를 선택할 수 있습니다.

레이아웃 파일 변경 : TextView에 아래 속성 추가

android:textIsSelectable="true"

Java 클래스 에서이 줄을 문법적으로 설정하십시오.

myTextView.setTextIsSelectable(true);

TextView를 길게 누르면 복사 / 붙여 넣기 작업 표시 줄이 나타납니다.


5
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
if (clipboard == null || clip == null)
    return;
clipboard.setPrimaryClip(clip);

그리고 수입 import android.content.ClipboardManager;


3

@ FlySwat은 이미 정답을 제시했습니다. 완전한 답변을 공유하고 있습니다.

ClipboardManager.setPrimaryClip ( http://developer.android.com/reference/android/content/ClipboardManager.html ) 메소드를 사용하십시오 .

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
ClipData clip = ClipData.newPlainText("label", "Text to copy");
clipboard.setPrimaryClip(clip); 

label 클립 데이터에 대한 사용자가 볼 수있는 레이블은 어디에 있으며 클립 text의 실제 텍스트입니다. 공식 문서 에 따르면 .

이 가져 오기를 사용해야합니다.

import android.content.ClipboardManager;

답변을 복사 / 붙여 넣기하는 이유는 무엇입니까? 라벨이란?
AlexS

내가 말했듯이 @AlexS가, 또 다른 친구가 이미 난 그냥 자세한 내용과 다른 방법을 게시하고있어, 정확한 답을 준, 나는 누군가를 위해 도움이 될 것이라고 생각
삼위 일체

1

여기 내 작업 코드가 있습니다

/**
 * Method to code text in clip board
 *
 * @param context context
 * @param text    text what wan to copy in clipboard
 * @param label   label what want to copied
 */
public static void copyCodeInClipBoard(Context context, String text, String label) {
    if (context != null) {
        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText(label, text);
        if (clipboard == null || clip == null)
            return;
        clipboard.setPrimaryClip(clip);

    }
}

yu가 코드를 공유 할 때 설명해보십시오. 당신은 방문하고 질문에 대답하는 방법을 확인할 수 있습니다 .
유누스 테무 렌크

@YunusTemurlenk 제안 해 주셔서 감사합니다. 다음에 설명으로 답변을 편집하겠습니다.
Mehul Boghra

1

Kotlin의 경우 다음 방법을 사용할 수 있습니다. 이 메소드를 활동 또는 프래그먼트에 붙여 넣을 수 있습니다.

fun copyToClipBoard(context: Context, message: String) {

    val clipBoard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clipData = ClipData.newPlainText("label",message)
    clipBoard.setPrimaryClip(clipData)

}

감사합니다! 은 context.내가 조각 내에서하고 있어요 때문에 될 수 - 내가 누락 된 일부였다.
Cullub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.