首页 > 解决方案 > Android:如何获取剪贴板数据?(无法获取剪贴板管理器)

问题描述

关于粘贴主题的Android官方文档说:

使用 getSystemService(CLIPBOARD_SERVICE) 获取全局 ClipboardManager 对象。还要声明一个全局变量来包含粘贴的文本:

var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var pasteData: String = ""

当我对片段执行完全相同的操作时,它会告诉我创建 getSystemService 函数。这是我所做的:

我的导入(我在 Android Studio 告诉我的所有内容上都单击了导入):

import android.content.ClipboardManager
import android.content.Context
import android.content.Context.CLIPBOARD_SERVICE
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.core.content.ContextCompat.getSystemService
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.google.android.material.textfield.TextInputEditText

我的代码:

class FirstFragment : Fragment() {
    var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    var pasteData: String = ""

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.pgn_page, container, false)
    }
    private fun pasteText():String {
        val abc = clipboard?.primaryClip
        val item = (abc?.getItemAt(0))
        return item?.text.toString()
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //val pgnBar: TextInputEditText = view.findViewById(R.id.pgncode)
        val pgnBar: TextInputEditText = view.findViewById(R.id.pgncode)
        val clipButton: Button = view.findViewById(R.id.clipboardButton)
        pgnBar.setText(PGNCode.value)

        clipButton.setOnClickListener{
            pgnBar.setText(pasteText())
        }

        view.findViewById<Button>(R.id.startAnalysisButton).setOnClickListener {
            PGNCode.value = pgnBar.getText().toString()
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }
}

我应该改变什么?

标签: androidkotlin

解决方案


getSystemService()是 in 中的一个方法,Context而 aFragment不是 a Context

当片段附加到片段时,您可以使用它requireContext()来访问片段的上下文。片段初始化阶段太早了。

所以添加上下文访问并移动

var clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

到一个函数,例如pasteText().


推荐阅读