タブレット用プログラムの書き止め

android OS & iPadOS の記録。

【kotlin】ViewModel と LiveData の利用

2024-02-09 23:08:39 | Android studio 日記

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で止まる。

フラグを更新させると画像を変化させられる事が実証できた。
デバイスが回転した時に条件によって画像を変化できる。

縦長なら一枚表示、横長なら左右並びで二枚表示という感じ。


取り合えず、一歩。