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

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

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

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

Kotlin

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

Q&A

0回答

986閲覧

onSaveInstanceでTextViewを保存する方法

Shibou

総合スコア15

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2020/06/30 08:33

画面の縦横を変更して画面を再構築するときに
TextViewを保存したいのですが、どうすればできるのかわかりません。
putIntでIDを保存できればonRestoreInstanceでfindViewByIdを使って
Viewを取得できるのではないかとも思いましたが、

Smart cast to 'TextView' is impossible,because 'chooseTextView' is a mutable property that could have been changed by this time
となってしまいうまくいきませんでした。

解決策を教えていただければ幸いです。

kotlin

1package com.example.theplanning1 2 3import android.graphics.Color 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.view.View 7import android.widget.TextView 8import com.example.theplanning.CalendarMaker 9import kotlinx.android.synthetic.main.calendar.* 10 11class MainActivity : AppCompatActivity() { 12 //CalendarMaker 13 lateinit var calendarMaker: CalendarMaker 14 15 //TextViewのIDが入った配列(6行7列) 16 private lateinit var dateViews: MutableList<MutableList<TextView>> 17 18 //今日の年月 19 var year = 0 20 var month = 0 21 22 //今日の日付 23 var today = 0 24 25 //選択されているTextView(これを保存したい) 26 var chooseTextView: TextView? = null 27 28 override fun onCreate(savedInstanceState: Bundle?) { 29 super.onCreate(savedInstanceState) 30 setContentView(R.layout.activity_main) 31 //CalendarMakerの取得 32 calendarMaker = CalendarMaker() 33 //年月日を取得する 34 year = calendarMaker.nowYear 35 month = calendarMaker.nowMonth 36 today = calendarMaker.nowDay 37 38 //TableLayoutのTextViewを取得する 39 dateViews = mutableListOf( 40 mutableListOf(one_one, one_two, one_three, one_four, one_five, one_six, one_seven), 41 mutableListOf(two_one, two_two, two_three, two_four, two_five, two_six, two_seven), 42 mutableListOf( 43 three_one, 44 three_two, 45 three_three, 46 three_four, 47 three_five, 48 three_six, 49 three_seven 50 ), 51 mutableListOf( 52 four_one, 53 four_two, 54 four_three, 55 four_four, 56 four_five, 57 four_six, 58 four_seven 59 ), 60 mutableListOf( 61 five_one, 62 five_two, 63 five_three, 64 five_four, 65 five_five, 66 five_six, 67 five_seven 68 ), 69 mutableListOf(six_one, six_two, six_three, six_four, six_five, six_six, six_seven) 70 ) 71 //最初は今日の日付のカレンダーを表示する 72 year_month.text = getString(R.string.year_month).format(year, month + 1) 73 //日付TextViewに日付とClickListenerをセットする 74 updateTextView() 75 } 76 77 //日付TextViewの更新 78 private fun updateTextView() { 79 //表示年月の変更 80 year_month.text = getString(R.string.year_month).format(calendarMaker.displayYear, calendarMaker.displayMonth + 1) 81 //表示月の日付が格納されたListを取得する 82 val dateList = calendarMaker.getList() 83 //dateListから何番目の文字列を取り出すか 84 var dateCount = 0 85 //日付TextViewにClickListenerを設定する 86 for (row in dateViews) { 87 for (date in row) { 88 //背景をリセットする 89 date.setBackgroundColor(Color.WHITE) 90 91 date.text = dateList[dateCount] 92 //日付が入らなかった場合 93 if (date.text.toString() == "") { 94 date.isClickable = false 95 //6行目の日曜日が空欄だった場合 96 if (date == six_one) { 97 //6行目を不可視化 98 lastWeek.visibility = View.GONE 99 //ループ終了 100 break 101 } else { 102 // 103 lastWeek.visibility = View.VISIBLE 104 } 105 }//日付入りの場合 106 else { 107 //ClickListenerを登録する 108 date.setOnClickListener { 109 //日付の選択がされていた場合 110 if (chooseTextView != null) { 111 //選択されていたのが今日の日付の場合 112 if (todayOrElse(chooseTextView!!)) { 113 //今日の日付用の背景に戻す 114 chooseTextView!!.setBackgroundResource(R.drawable.today) 115 } else { 116 //今日以外の日付用の背景に戻す 117 chooseTextView!!.setBackgroundColor(Color.WHITE) 118 } 119 } 120 //選択した日付を記録する 121 chooseTextView = it as TextView 122 123 //今日の日付がクリックされた場合 124 if (todayOrElse(chooseTextView!!)) { 125 //背景を変更する 126 it.setBackgroundResource(R.drawable.today_and_choose_day) 127 } else { 128 //背景を変更する 129 it.setBackgroundResource(R.drawable.choose_day) 130 } 131 //RecyclerViewを作り直す 132 133 }//end ClickListener 134 //今日の日付の場合(背景を今日の日付用のものに変える) 135 if (todayOrElse(date)) date.setBackgroundResource(R.drawable.today) 136 } 137 //カウントを1追加 138 dateCount++ 139 } 140 } 141 } 142 //月を一つ前にする 143 fun onPreviousMonth(view: View){ 144 //選択日をリセット 145 chooseTextView = null 146 //CalendarMakerを前の月に更新 147 calendarMaker.previous() 148 //TextViewの更新 149 updateTextView() 150 } 151 //月を一つ進める 152 fun onNextMonth(view: View){ 153 //選択日をリセット 154 chooseTextView = null 155 //CalendarMakerを次の月に更新 156 calendarMaker.nextMonth() 157 //TextViewの更新 158 updateTextView() 159 } 160 //今日の日付のTextViewかどうか 161 fun todayOrElse(date: TextView): Boolean { 162 //今日の年月 163 val chooseYearMonth = getString(R.string.year_month).format(year, month + 1) 164 //表示されている年月日が選択されているTextViewの年月日と等しいかどうか 165 if (date.text.toString() == today.toString() && 166 year_month.text.toString() == chooseYearMonth 167 ) { 168 return true 169 } 170 return false 171 } 172 //画面を破棄したときのデータ保存処理 173 override fun onSaveInstanceState(outState: Bundle) { 174 super.onSaveInstanceState(outState) 175 //CalendarMakerを保存する 176 outState.putParcelable("CalendarMaker",calendarMaker) 177 } 178 //画面を再構築したときのデータ取得処理 179 override fun onRestoreInstanceState(savedInstanceState: Bundle) { 180 super.onRestoreInstanceState(savedInstanceState) 181 182 savedInstanceState.run { 183 //CalendarMakerを取得 184 calendarMaker = getParcelable("CalendarMaker")!! 185 } 186 //TextViewの更新 187 updateTextView() 188 } 189}

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

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

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

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

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

hoshi-takanori

2020/07/02 10:39

TextView そのものは保存できません。TextView に表示されている内容を保存すればいいのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問