我需要将文本复制到剪贴板,因此我使用了在 MainActivity 中已经使用过的代码:
val myClipboard: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val myClip: ClipData
问题是,这段代码在 Activity 上运行良好,但在 Fragment 上(显然)不行。
在
getSystemService
:
类型推断失败:fun getSystemService(p0: Context, p1: Class): T? 不能应用于 (字符串)
在
CLIPBOARD_SERVICE
:
类型不匹配:推断类型是 String,但需要 Context
我已经尝试过
getSystemService(context!!, CLIPBOARD_SERVICE)
但不起作用
当你的类是一个片段时,你可以通过在 Java 中调用
getActivity()
或在 Kotlin 中调用 activity
来获取对其父 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)
}
在Java中,当你的类是一个fragment时,你可以通过调用getActivity()来获取对其父Activity的引用。在 Kotlin 中,您可以通过使用关键字 Activity 来实现相同的目的。
您可以在此处查看完整步骤。 https://youtu.be/crW3Pfl7OBg