Kotlin Android - 从片段复制到剪贴板



我需要将文本复制到剪贴板,所以我使用了已经在 MainActivity 中使用的代码:

val myClipboard: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val myClip: ClipData

问题是,此代码在活动上工作正常,但(显然)在片段上不起作用。

getSystemService

类型推断失败:fun getSystemService(p0:上下文,p1:类):T? 不能应用于 (字符串)

CLIPBOARD_SERVICE

类型

不匹配:推断类型为字符串,但上下文是预期的

我试过

getSystemService(context!!, CLIPBOARD_SERVICE)

但不起作用

当你的类是一个片段时,你可以通过在 Java 中调用getActivity()或在 Kotlin 中调用activity来获取对其父 Activity 的引用。

使用此方法,您可以将活动中的代码更改为

val myClipboard: ClipboardManager = activity.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val myClip: ClipData

在 Kotlin 的上下文中使用强制解包(!!) 不是一个好主意。 在您的片段类中,您可以使用以下代码,这对于任何 NPE 都是安全的并且非常干净。

(requireActivity().getSystemService(CLIPBOARD_SERVICE) as ClipboardManager).apply {
setPrimaryClip(ClipData.newPlainText("simple text", "some other text"))
}

祝您编码愉快!

在 android x 中,getSystemService()的构造函数会发生变化。现在你必须像这样调用剪贴板(你可以使用activity!!context!!)

var myClipboard = getSystemService(context!!, ClipboardManager::class.java) as ClipboardManager
val clip: ClipData = ClipData.newPlainText("simple text", text)
myClipboard.setPrimaryClip(clip)

这里有一个简洁的扩展乐趣,适合 Kotlin 用户:

fun Fragment.copyToClipboard(text: String, label: String? = null) {
(requireActivity().getSystemService(CLIPBOARD_SERVICE) as ClipboardManager).apply {
setPrimaryClip(ClipData.newPlainText(null, text))
}
displayToast(R.string.text_copied_to_clipboard, Toast.LENGTH_LONG)
}

最新更新