Android:从TextView中复制所选文本到剪贴板

21

有没有可能仅从TextView UI组件中复制所选文本到剪贴板?

我已经捕获了长按事件并复制了整个文本到剪贴板,但现在我想指定要从TextView复制的选择文本的起始位置和结束位置。

谢谢。


如果您可以使用EditText而不是TextView,那么您可能可以实现这一点。 - Andro Selva
2个回答

100
TextView tv;
String stringYouExtracted = tv.getText().toString();
int startIndex = tv.getSelectionStart();
int endIndex = tv.getSelectionEnd();
stringYouExtracted = stringYouExtracted.subString(startIndex, endIndex);
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.setText(stringYouExtracted);

编辑(上面是完整答案,但我不小心遇到我的答案,所以想补充一下):

使用较新的API,请将最后两行更改为:

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

"Copied Text"是较新的API中COPY实体的标题。


但是如何通过长按TextView来指定开始索引和结束索引呢? - dorin
@ASP它应该在所有设备上都能正常工作,但我还没有100%测试过。如果它不能正常工作,请告诉我们。 - Sherif elKhatib
@SherifelKhatib 但是android.os.Build.VERSION_CODES.HONEYCOMB在低版本上无法使用。不过“else”部分对我完美地起作用。谢谢。 - ASP
你如何使用类似于 service call clipboard 2 i32 1 i32 0 s16 "Hi there" 这样的命令行来运行"else"部分? - not2qubit

1
你可以这样做:
ClipboardManager myClipboard = myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData myClip;
EditText editText = (EditText) findViewById(R.id.editText3);
int min = 0;
int max = editText.getText().length();
if (editText.isFocused()) {
    final int selStart = editText.getSelectionStart();
    final int selEnd = editText.getSelectionEnd();
    min = Math.max(0, Math.min(selStart, selEnd));
    max = Math.max(0, Math.max(selStart, selEnd));
}
// here is your selected text
final CharSequence selectedText = editText.getText().subSequence(min, max);
String text = selectedText.toString();


// copy to clipboard
myClip = ClipData.newPlainText("text", text);
myClipboard.setPrimaryClip(myClip);

用TextView替换EditText


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接