質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

4257閲覧

kotlin androidでlistViewにSharedPreferencesに保存したデータを表示したい。

sr2000

総合スコア39

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/01/13 11:13

kotlin学習中の者です。現在SharedPreferencesとListViewの学習の為に、SharedPreferencesにて保存したデータをListViewに表示する実装を行っています。

保存に関してはtextEditに入力した文字を保存していくのですが、ここで理解できていないのがデータはkeyを用いて保存されていくと認識してきますが、保存するたびにkeyを変更しないとデータは上書きされてしまいますか?
別のfragment(ListView表示する画面)ではadapterにaという変数に保存した時のkeyを渡してあげたのですが、おそらく配列ではないのでエラーが発生しています。以下に保存fragmentと表示fragmentを載せましたのでどなたかご教授いただけませんでしょうか?宜しくおねがいします。

kotlin

1class InspectionDataSavedFragment: Fragment() { 2 3 4 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 5 super.onCreateView(inflater, container, savedInstanceState) 6 7 8 9 return inflater.inflate(R.layout.fragment_inspection_data_saved, container, false) 10 } 11 12 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 13 super.onViewCreated(view, savedInstanceState) 14 15 val pref = context!!.getSharedPreferences("file_name", Context.MODE_PRIVATE) 16 resultView.text = pref.getString("key", "未登録") 17 18 savedButton.setOnClickListener { 19 20 val a = editText.text.toString() 21 22 //保存処理を入れる 23 pref.edit().putString("key", a).apply() 24 25 Toast.makeText(context, "保存しました", Toast.LENGTH_SHORT).show() 26 27 } 28 } 29 30}

kotlin

1class InspectionListFragment: Fragment() { 2 3 4 5 6 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { 7 super.onCreateView(inflater, container, savedInstanceState) 8 9 return inflater.inflate(R.layout.fragment_inspection_list, container, false) 10 } 11 12 13 14 15 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 16 super.onViewCreated(view, savedInstanceState) 17 18 19 20 //適当なデータ配列を表示してみる 21 val dataArray = arrayOf("kotlin", "android", "swift", "ios") 22 23 val pref = context!!.getSharedPreferences("file_name", Context.MODE_PRIVATE) 24 val a = pref.getString("key", "ng") 25 26 //adapterを作成 27 val myadapter = ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, a) 28 29 //adapterを追加 30 listView.adapter = myadapter 31 32 //選択時の処理 33 listView.setOnItemClickListener { parent, view, position, id -> 34 Toast.makeText(context, "test", Toast.LENGTH_SHORT).show() 35 36 //タップしたら詳細画面へ画面遷移 37 val inspectionDetailFragment = InspectionDetailFragment() 38 39 40 41 //fragmentからfragmentへの画面遷移は少し違いがあるので注意すること 42 val transaction = fragmentManager!!.beginTransaction() 43 transaction.replace(R.id.container, inspectionDetailFragment) 44 45 //戻る機能を追加したい場合はこの行を追加すること 46 transaction.addToBackStack(null) 47 transaction.commit() 48 49 //val intent = Intent(context, InspectionDetailFragment::class.java) 50 //startActivity(intent) 51 52 } 53 54 55 } 56 57 58 59}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2019/01/14 15:00

ListViewを用いたいということは、表示したいデータを複数持ちたいということですよね?現在ご提示いただいているコードだと、String型の変数1つのやり取りしか行っていないようです。「まずは1つのEditTextの文字列をListViewに反映させることができれば良い」という第一段階としてのご質問なのでしょうか?
sr2000

2019/01/14 15:28

ご指摘ありがとうございます。ListViewでデータを複数持たせたいです。入力したデータを配列のような形で持たせてListViewにその配列を表示したいです。
keicha_hrs

2019/01/19 11:05 編集

入力元が(例えばEditTextならば)EditText1、EditText2、EditText3・・・のような感じで、複数あるということなのでしょうか。
keicha_hrs

2019/01/19 08:21

あと、これが一番大きな問題なのですが、このコードの内容だけについて言えば、情報伝達にはIntentを用いるのが最適であり、SharedPreferencesを用いるのは適切ではありません。しかし、学習のために敢えてSharedPreferencesを使いたいということなのですよね?
guest

回答1

0

ベストアンサー

先走りな回答で、質問の意図しているところと全然違っていたら申し訳ありません。

まず、SharedPreferencesへの情報保存は、基本的に1つのキーに1つの情報しか格納できません。例えばEditTextが3つあったとして、"key"というPreferenceに3回そのEditTextの情報を書き込もうとしたら、最後に書いた情報だけが残ってしまいます。

それを避けるための方法として、一番単純なのはキーを増やしてしまうことです。

kotlin

1 val pref = getSharedPreferences("file_name", Context.MODE_PRIVATE) 2 button1.setOnClickListener { 3 val editor = pref.edit() 4 editor.putString("key1", editText1.text.toString()) 5 editor.putString("key2", editText2.text.toString()) 6 editor.putString("key3", editText3.text.toString()) 7 editor.apply() 8 }

とすれば、取り出し側では

kotlin

1 val pref = getSharedPreferences("file_name", Context.MODE_PRIVATE) 2 var a = emptyArray<String>() 3 for (i in 0..2) { 4 val str = pref.getString("key${i + 1}", null) 5 if (str != null) { 6 a += str 7 } 8 } 9 10 if (!a.isEmpty()) { 11 val myadapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, a) 12 listView.adapter = myadapter 13 }

のようにでもすれば実現できると思います。


が、恐らくこれでは目的を満たさないのではないかと思いました。1つのキーで複数の文字列情報を保持したいということだろうと想像しています。もしそれを実現するならば、何かしらの方法で複数の連結して一つの文字列に変換して、それを保存することでしょう。取り出し側でも、それを分解して元の複数の文字列に戻す処理を実装することになります。

これにはいろいろ方法があるでしょうが、JSONを使うのがその一つになるでしょう。保存側では、JSONArray()を使ってJSONとして情報を詰め込み、それをtoString()で文字列化して保存します。

kotlin

1 val pref = getSharedPreferences("file_name", Context.MODE_PRIVATE) 2 button1.setOnClickListener { 3 val a = JSONArray() 4 a.put(editText1.text.toString()) 5 a.put(editText2.text.toString()) 6 a.put(editText3.text.toString()) 7 val edit = pref.edit() 8 edit.putString("key", a.toString()) 9 edit.apply() 10 }

取り出し側では、1つの文字列として取り出した情報をJSONArray#getString()で取り出しつつ配列に格納していきます。

kotlin

1 val pref = getSharedPreferences("file_name", Context.MODE_PRIVATE) 2 val str = pref.getString("key", null) 3 if (str != null) { 4 val json = JSONArray(str) 5 var a = emptyArray<String>() 6 for (i in 0..(json.length() - 1)) { 7 a += json.getString(i) 8 } 9 10 if (!a.isEmpty()) { 11 val myadapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, a) 12 listView.adapter = myadapter 13 } 14 }

こんなところでご要望を満たせるでしょうか?

投稿2019/01/19 10:02

編集2019/01/19 10:15
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sr2000

2019/02/10 10:17

返信が遅くなってしまい、大変申し訳ありません。 とても丁寧なご回答ありがとうございます。 大変わかりやすく望んていた実装が完了いたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問