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

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

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

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Android

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

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

2269閲覧

Modelでセットした値の変更通知を受け取る方法がわからない(Kotlin)

ribro

総合スコア14

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Android

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

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2020/01/18 15:36

編集2020/01/19 01:27

前提・実現したいこと

KotlinでAndroidアプリ開発の勉強を始めた初心者です。(C#歴は5年ほど)

MVVMアーキテクチャで、
シンプルな電卓のようなアプリケーションを作成しています。

Modelで算出した値を、画面のTextViewに反映したいのですが、実装方法がわかりません。

発生している問題

ViewModelで電卓ボタンのクリックイベントを受け取る
→ Modelの計算クラスの計算処理が走る
→ Modelのデータクラスの値(ObservableField<T>)を更新★ここまではOK

ObservableField<T>に値がセットされた時に、
①変更通知を上げる方法がわからない
②変更通知を上げたとして、それをどのように監視すればよいかわからない

該当のソースコード

Kotlin

1// 計算処理を行うクラス(Model) 2object Calculation { 3~省略~ 4 // 計算結果をデータクラスにセットする 5 // ※setValueには計算結果を格納 6 CalcData.resultData.set(setValue) 7~省略~ 8}

Kotlin

1// 計算結果を保持するクラス(Model) 2object CalcData { 3 // 監視する計算結果 4  // Calculation からセットして、画面に表示させたい 5 val resultData = ObservableField<String>("0") 6}

...

なんとなく、以下のような実装をイメージしています。
ViewModelがModelのデータクラスの値を監視し、変更通知を受け取る
→ ViewModel内のViewとバインドしている値をさらに更新
→ Viewに通知され値が更新される

Kotlin

1// 画面にバインドしているViewModelクラス 2class HogeViewModel : ViewModel(){ 3 private var mResult = MutableLiveData<String>().apply{ 4 value = "0" 5 } 6 // Viewとバインドしている値 7 val result: LiveData<String> 8 get() = mResult 9 10 11 // こんなかんじでデータを監視する? 12 val aaa = CalcData.resultData.addOnPropertyChangedCallback() 13 14 // ★にはコールバック関数を登録? 15 16 // コールバック関数 17 fun fuga(){ 18 // データクラスの値を、result に反映して、Viewが更新 19 result = CalcData.resultData.get()!! 20 } 21}

↑めちゃくちゃですが、調べても調べてもベストプラクティスがわからず、、頭が爆発しそうです。
ご経験のある先輩方がいらっしゃいましたら、ご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ObservableFieldはDataBindingライブラリに属するクラスで、Viewとデータ(主にViewModel)間のやり取りをするためのものですので、Model<->ViewModel間で使う利点は無いと思います。あえてObservableFieldを使いつつLiveDataに変換してViewModel内で使いたいということであれば、以下のような形になるでしょう。変更通知はObservableField#setの際に自動的に呼ばれます。

kotlin

1class HogeViewModel : ViewModel(){ 2 private val mResult = MutableLiveData<String>() ... 3 private val fugaCallback = object : Observable.OnPropertyChangedCallback() { 4 override fun onPropertyChanged(sender: Observable?, propertyId: Int) { 5 mResult.value = CalcData.resultData.get() 6 } 7 } 8 9 init { 10 CalcData.resultData.addOnPropertyChangedCallback(fugaCallback) 11 } 12 13 override fun onCleared() { 14 // 後片付けを忘れずに 15 CalcData.resultData.removeOnPropertyChangedCallback(fugaCallback) 16 } 17}

特にObservableFieldを使うことにこだわりがないのであれば、Model<->ViewModel間もLiveDataで統一してしまった方がスッキリと書けます。

投稿2020/01/20 03:29

編集2020/01/20 03:35
kakajika

総合スコア3131

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

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

ribro

2020/01/21 15:44

解決できました!ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問