ViewModel と LiveData を組み合わせて MainActivity で画像切り替えができるか試す。
ところがデベロッパーの説明の「 by viewModels() 」が利用できない。インポートもできない。
探しても情報が出てこない。
諦めかけた時に
サイト 【穀風】kokufu.blogspot.com
”by ViewModels() を使って ViewModel を取得する方法”
を見つけました。
ありがとうございました。
APIレベルの関係で少し調整しましたが期待通りの動作が行えました。
そのコードは以下の通りです。
【MainViewModel.kt】
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainViewModel: ViewModel() {
val screenType: MutableLiveData<Boolean> by lazy {
MutableLiveData<Boolean>()
}
override fun onCleared() {
super.onCleared()
}
}
【MainActivity.kt】
・・・
import androidx.activity.viewModels
class MainActivity : AppCompatActivity() {
private val viewModel:MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState==null) { //初回
viewModel.screenType.value = true //フラグをセット
setImage() //画像Aをセット
}
val dispTypeObserver = Observer<Boolean> {type ->
//省略。画像BをImageViewにセットする
}
//viewModel.screenTypeが更新されたら実行されるコードをセットする
viewModel.screenType.observe(this, dispTypeObserver )
//true から false に更新させる
viewModel.screenType.value = false
}
fun setImage(){
// 省略。Picturesディレクトリから画像ファイルを読み込みImageViewにセットしている
}
}
穀風さんの設定をしないと
by viewModels()
これがエラーでビルドできない。
エミュ実行で画像Bが表示された。
Observerを切れば画像Aで止まる。
フラグを更新させると画像を変化させられる事が実証できた。
デバイスが回転した時に条件によって画像を変化できる。
縦長なら一枚表示、横長なら左右並びで二枚表示という感じ。
取り合えず、一歩。