我需要将文本复制到剪贴板,所以我使用了已经在 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)
}