実現したいこと
sharedpreferencesでデータを保存し、アプリを一度閉じても保存されたデータが読み込まれるようにしたい。
前提
sharedpreferencesでデータを保存しようとしているが、アプリを一度閉じた後にもう一度見てみるとデータが初期化されている。
具体的には駅の名前を保存しようとしている。駅の名前を入力したときにstation1Name変数がnullだったら代入し、変数の中身を表示しているテキストボックスの横にあるデリートボタンを押すと変数の中身をnullに変更するようになっている。それぞれapply()はしているため保存はされているはず。
発生している問題・エラーメッセージ
特にエラーは発生していない
該当のソースコード
Kotlin
1package com.example.CompetitionApp 2 3import android.content.Context 4import android.os.Bundle 5import android.view.LayoutInflater 6import android.view.View 7import android.view.ViewGroup 8import androidx.fragment.app.Fragment 9import com.example.CompetitionApp.R 10import com.example.CompetitionApp.databinding.FragmentHomeBinding 11 12private const val ARG_PARAM1 = "param1" 13private const val ARG_PARAM2 = "param2" 14 15class HomeFragment : Fragment() { 16 // TODO: Rename and change types of parameters 17 private var param1: String? = null 18 private var param2: String? = null 19 20 private var _binding: FragmentHomeBinding? = null 21 private val binding get() = _binding!! 22 23 //データ保存の準備 24 val sharedPref = getActivity()?.getSharedPreferences( 25 getString(R.string.preference_file_key), Context.MODE_PRIVATE) 26 val editor = sharedPref ?.edit() 27 28 //変数を定義 29 var station1Name: String? = sharedPref?.getString("Station1Name", "NoData") 30 31 override fun onCreate(savedInstanceState: Bundle?) { 32 super.onCreate(savedInstanceState) 33 arguments?.let { 34 param1 = it.getString(ARG_PARAM1) 35 param2 = it.getString(ARG_PARAM2) 36 } 37 } 38 39 override fun onCreateView( 40 inflater: LayoutInflater, container: ViewGroup?, 41 savedInstanceState: Bundle? 42 ): View { 43 _binding = FragmentHomeBinding.inflate(layoutInflater, container, false) 44 val view = binding.root 45 46 // ボタンクラスのインスタンス作成 47 val btnListener = BtnListener() 48 49 // リスナを設定 50 binding.searchbutton.setOnClickListener(btnListener) 51 52 binding.stationsearch 53 54 if(station1Name != null){ 55 binding.station1.text = station1Name 56 } 57 58 return view 59 } 60 61 //binding 解放 62 override fun onDestroyView() { 63 super.onDestroyView() 64 _binding = null 65 } 66 67 companion object { 68 fun newInstance(param1: String, param2: String) = 69 HomeFragment().apply { 70 arguments = Bundle().apply { 71 putString(ARG_PARAM1, param1) 72 putString(ARG_PARAM2, param2) 73 } 74 } 75 } 76 77 //ボタンが押されたときの設定 78 private inner class BtnListener: View.OnClickListener{ 79 override fun onClick(v: View) { 80 when(v.id){ 81 binding.searchbutton.id -> { 82 //検索ボタンの処理 83 val searchstation: String = binding.stationsearch.getText().toString() 84 //入力がなければ何もしない 85 if(searchstation != ""){ 86 //新しく入力された値を代入 87 if(station1Name == null){ 88 station1Name = searchstation 89 editor?.putString("Station1Name", station1Name) 90 editor?.apply() 91 binding.station1.text = station1Name 92 } 93 } 94 } 95 96 //デリートボタンが押された時の処理 97 binding.station1del.id -> { 98 station1Name = null 99 100 editor?.putString("Station1Name", station1Name) 101 editor?.apply() 102 103 binding.station1.text = getString(R.string.nodata) 104 } 105 } 106 } 107 } 108}
試したこと
データが消えてしまう条件がアプリを閉じたときのみであることを確かめたが、この場合どうすればいいのかは調べても出てこず、全く見当がつかない。
補足情報(FW/ツールのバージョンなど)
・ほかのfragmentに移動して戻ってきた後
・バックグラウンドに行った後
・実行しているエミュレータをスリープにしてもう一度起動した後
以上の3パターンはデータが残っていることを確認している。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/11/04 01:38 編集
2023/11/04 04:35 編集
2023/11/04 06:43
2023/11/04 06:45
2023/11/04 07:03
2023/11/05 10:06