You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Fragment中点击按钮用SharedPreferences报错的解决求助

解决Fragment中使用SharedPreferences的「Unresolved reference: getSharedPreference」错误

问题原因

getSharedPreference是Context类的方法,Fragment本身不直接提供该方法;同时你代码里还犯了一个拼写错误:正确方法名是getSharedPreferences(复数形式),少写末尾的s也会导致报错。

解决方案

在Fragment中获取SharedPreferences,需要通过Fragment关联的Context来调用方法,推荐以下两种可靠方式:

方式1:使用requireContext()(推荐)

当Fragment已经依附到Activity时,requireContext()会返回非空的Context,避免空指针风险:

val sharedPreferences: SharedPreferences =
    requireContext().getSharedPreferences("MyFacts", MODE_PRIVATE)

方式2:可空安全调用(适配Fragment未依附场景)

如果Fragment可能处于未绑定Activity的状态,用activity?.配合空安全处理:

activity?.let { ctx ->
    val sharedPreferences = ctx.getSharedPreferences("MyFacts", MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    editor.putString("UserName", usernameFromEditText)
    editor.apply()
}

修改后的完整代码片段

建议将数据保存逻辑放在页面跳转前,确保数据持久化完成后再导航:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    view.findViewById<Button>(R.id.button_connect).setOnClickListener {
        val serverURIFromEditText =
            view.findViewById<EditText>(R.id.edittext_server_uri).text.toString()
        val clientIDFromEditText =
            view.findViewById<EditText>(R.id.edittext_client_id).text.toString()
        val usernameFromEditText =
            view.findViewById<EditText>(R.id.edittext_username).text.toString()
        val pwdFromEditText =
            view.findViewById<EditText>(R.id.edittext_password).text.toString()

        // 保存数据到SharedPreferences
        val sharedPreferences = requireContext().getSharedPreferences("MyFacts", MODE_PRIVATE)
        val editor = sharedPreferences.edit()
        editor.putString("UserName", usernameFromEditText)
        editor.putString("ServerURI", serverURIFromEditText)
        editor.putString("ClientID", clientIDFromEditText)
        editor.putString("Password", pwdFromEditText)
        editor.apply()

        // 跳转到目标Fragment
        val mqttCredentialsBundle = bundleOf(
            MQTT_SERVER_URI_KEY to serverURIFromEditText,
            MQTT_CLIENT_ID_KEY to clientIDFromEditText,
            MQTT_USERNAME_KEY to usernameFromEditText,
            MQTT_PWD_KEY to pwdFromEditText
        )

        findNavController().navigate(
            R.id.action_ConnectFragment_to_ClientFragment,
            mqttCredentialsBundle
        )
    }
}

内容的提问来源于stack exchange,提问作者user1114881

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:57:33