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

问题描述 投票:0回答:5

我需要将文本复制到剪贴板,因此我使用了在 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)

但不起作用

android android-fragments kotlin clipboard
5个回答
11
投票

当你的类是一个片段时,你可以通过在 Java 中调用

getActivity()
或在 Kotlin 中调用
activity
来获取对其父 Activity 的引用。

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

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

11
投票

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

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

快乐编码!


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)
}

0
投票

在Java中,当你的类是一个fragment时,你可以通过调用getActivity()来获取对其父Activity的引用。在 Kotlin 中,您可以通过使用关键字 Activity 来实现相同的目的。

您可以在此处查看完整步骤。 https://youtu.be/crW3Pfl7OBg

© www.soinside.com 2019 - 2024. All rights reserved.