Android Fragment中点击按钮用SharedPreferences报错的解决求助
问题原因
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
相关产品推荐
相关产品推荐

