Kotlin Android - 从Fragment复制到剪贴板

5

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

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

问题是,这段代码在Activity上运行良好,但在Fragment上却不行(显然)。
getSystemService中:

类型推断失败:fun getSystemService(p0: Context, p1: Class): T? 无法应用于 (String)

CLIPBOARD_SERVICE中:

类型不匹配:推断类型为String,但期望的是Context

我尝试使用: getSystemService(context!!, CLIPBOARD_SERVICE) 但它不起作用。
4个回答

11

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

使用这种方法,你可以更改你的Activity中的代码为:

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

11

在 Kotlin 中,强制解包 ( !! ) 上下文并不是一个好主意。 在您的片段类中,您可以使用下面的代码来避免任何空指针异常,并且非常干净。

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

快乐编程!


截至今天,这是适当的答案。 - Codedman

3
在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)

0

这是一个很棒的 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)
}

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