app>src>main>java>com.example.tabapplication>ui>home>NotificationsFragment.kt
先頭にファイルfruits.datがあればgetFile2Data関数呼出、なければputData2File関数呼出を追加。
Viewが終わる時にputData2File関数呼出を追加。
getFile2Data関数で、ファイルを入力オープンし、読込各行をカンマで分割し、dataから元ListItem削除、dataに新ListItemを追加。
putData2File関数で、ファイルを出力オープンし、dataの各ListItemの値をカンマ結合。改行結合してできた文字列をファイルに書込。
contextのところにrequireContext()。Listの項目修正に、removeとadd。
実行
開始時にWebを表示。
戻って、Notificationsを選択。
通知設定状況を変化させる。
Home選択でWebを表示。アプリを終了
Android Studioの[表示]-[ツール・ウィンドウ]-[デバイス・ファイル・エクスプローラー]
デバイスを選択して[data]-[data]-[com.example.tabapplication]-[files]にあるfruits.datをダブルクリック
変化させた通知設定状況が表示される。
アプリを起動してWebを表示。
戻って、Notificationsを選択。
変化させた通知設定状況が表示される。
先頭にファイルfruits.datがあればgetFile2Data関数呼出、なければputData2File関数呼出を追加。
Viewが終わる時にputData2File関数呼出を追加。
getFile2Data関数で、ファイルを入力オープンし、読込各行をカンマで分割し、dataから元ListItem削除、dataに新ListItemを追加。
putData2File関数で、ファイルを出力オープンし、dataの各ListItemの値をカンマ結合。改行結合してできた文字列をファイルに書込。
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { notificationsViewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java) _binding = FragmentNotificationsBinding.inflate(inflater, container, false) val root: View = binding.root val list = root.findViewById<ListView>(R.id.list) val adapter = MyListAdapter(requireContext(), data, R.layout.list_item) list.adapter = adapter list.setOnItemClickListener{ _, _, position, id -> val item = adapter.getItem(position) val newItem = ListItem(id,item.kind,!item.checked) data.removeAt(position) data.add(position,newItem) adapter.notifyDataSetChanged() } return root } override fun onDestroyView() { super.onDestroyView() _binding = null }
→
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val file = requireContext().getFileStreamPath("fruits.dat") if(file.exists()){ getFile2Data() }else{ putData2File() } notificationsViewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java) _binding = FragmentNotificationsBinding.inflate(inflater, container, false) val root: View = binding.root val list = root.findViewById(R.id.list) val adapter = MyListAdapter(requireContext(), data, R.layout.list_item) list.adapter = adapter list.setOnItemClickListener{ _, _, position, id -> val item = adapter.getItem(position) val newItem = ListItem(id,item.kind,!item.checked) data.removeAt(position) data.add(position,newItem) adapter.notifyDataSetChanged() } return root } override fun onDestroyView() { putData2File() super.onDestroyView() _binding = null } private fun getFile2Data(){ var pos = -1 var id:Long = 0 requireContext().openFileInput("fruits.dat") .bufferedReader().forEachLine { pos += 1 id += 1 val arr = it.split(",") var chk = false if(arr[2] == "1") chk = true data.removeAt(pos) val newItem = ListItem(id,arr[1],chk) data.add(pos,newItem) } } private fun putData2File(){ val str = StringBuilder() data.forEach{ var chk = "0" if (it.checked) chk = "1" str.append("${it.id},${it.kind},${chk}") str.append(System.getProperty("line.separator")) } requireContext().openFileOutput("fruits.dat", AppCompatActivity.MODE_PRIVATE) .bufferedWriter().use { it.write(str.toString()) } }
実行
開始時にWebを表示。
戻って、Notificationsを選択。
通知設定状況を変化させる。
Home選択でWebを表示。アプリを終了
Android Studioの[表示]-[ツール・ウィンドウ]-[デバイス・ファイル・エクスプローラー]
デバイスを選択して[data]-[data]-[com.example.tabapplication]-[files]にあるfruits.datをダブルクリック
変化させた通知設定状況が表示される。
アプリを起動してWebを表示。
戻って、Notificationsを選択。
変化させた通知設定状況が表示される。