วิธีคัดลอกข้อความโดยทางโปรแกรมในแอพ 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.

มีวิธีการทำเช่นนี้หากไม่มีClip Trayปรากฏขึ้นหรือไม่ (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 บรรทัด 245 ปัญหา Android Lint
JavaRunner

2
คุณเพิ่มเป้าหมายและ min sdk ลงในรายการของคุณหรือไม่ ถ้าใช่ปิดการใช้งานคำเตือนผ้าสำลี
Warpzit

4
เพิ่ม 3 บรรทัดต่อไปนี้เหนือเมธอดของคุณ @SuppressLint ({"NewApi", "NewApi", "NewApi", "NewApi"}), @SuppressWarnings ("deprecation"), @TargetApi (11) ........ นั่นคือสิ่งที่ฉันทำและใช้งานได้
RRTW

2
ใครช่วยกรุณาบอกฉันว่าสิ่งที่มีการใช้วิธีการlabelในnewPlainText? label User-visible label for the clip data.รัฐ documentaion แต่เมื่อlabelผู้ใช้มองเห็นได้? ฉันควรใส่ค่า / ชื่อlabelอะไร
shadyinside

@tannerjohn ฉันเดาว่ามันเป็นบางตัวอย่างที่ใช้ที่ไหนสักแห่ง แต่ฉันไม่รู้ว่าอยู่ที่ไหน แต่คุณสามารถใช้ข้อความเดิมสองครั้งได้ ...
Warpzit

15

Googling นำคุณไปสู่ ​​android.content.ClipboardManager และคุณสามารถตัดสินใจได้อย่างที่ฉันทำคลิปบอร์ดนั้นไม่สามารถใช้ได้บน API API <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());
        }
    }
}

เป็นไปไม่ได้ที่จะโทรหาวิธีการคัดลอก / วาง / ตัดของ android โดยไม่ต้องเขียนเหมือนที่คุณทำ ฉันสร้างแถบเครื่องมือการเลือกข้อความที่กำหนดเองพร้อมฟังก์ชั่นสำหรับผู้ใช้เพื่อให้สามารถเลือกข้อความที่เป็นตัวหนา / ตัวเอียง / ขีดเส้นใต้เป็นต้น แต่หลังจากการปรับแต่งฟังก์ชั่นเริ่มต้นคัดลอก / วาง / ตัดไม่ทำงานอีกต่อไป พวกเขายังคงปรากฏขึ้น?

"WordKeeper" มีไว้ทำอะไร?
นักพัฒนา android

7

อัปเดตห้องสมุดสนับสนุน Android

ในฐานะของ 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.ClipboardManagerClipData
  • หากคุณไม่ได้อยู่ในกิจกรรมคุณสามารถขอรับบริการcontext.getSystemService()ได้
  • ผมเคยลอง / nullจับบล็อกสำหรับการวางข้อความเพราะหลายสิ่งที่สามารถ คุณสามารถตรวจสอบแต่ละรายการหากคุณพบวิธีที่สามารถอ่านได้

1
"ป้ายข้อความ" สำหรับทำอะไร
นักพัฒนา android

@androiddeveloper ฉันไม่เคยใช้ป้ายกำกับกับสิ่งใด แต่เห็นคำถามและคำตอบนี้
Suragch

ดังนั้นแม้ว่าจะระบุว่าผู้ใช้มองเห็นได้ แต่จริงๆแล้วไม่ได้และขึ้นอยู่กับนักพัฒนาที่จะใช้หากจำเป็น
นักพัฒนา android

5

หากต้องการเปิดใช้งานการคัดลอก / วางมาตรฐานสำหรับ TextView คุณสามารถเลือกหนึ่งในรายการต่อไปนี้:

เปลี่ยนไฟล์เลย์เอาต์: เพิ่มคุณสมบัติด้านล่างลงใน 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;

ทำไมคุณคัดลอก \ paste คำตอบ ฉลากคืออะไร
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);

    }
}

เมื่อคุณแบ่งปันรหัสพยายามอธิบาย คุณสามารถเยี่ยมชมและตรวจสอบวิธีการที่จะตอบคำถาม
Yunus Temurlenk

@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.