🔄 そもそもなぜ必要?(背景)
Androidでは、ActivityやFragmentはライフサイクルに応じて破棄・再生成されます。
たとえば、画面を回転すると Activity
が破棄されて新しく作り直されます。そのとき、変数や状態は初期化されてしまうので、ユーザーが入力したデータや表示中の情報が失われてしまいます。
これをうまく管理するために、状態管理やUIデータとの連携を分離・整理する必要があります。
🧠 ViewModel とは?
ViewModel
は 画面に表示するためのデータ(状態)を保持するクラス です。
- ActivityやFragmentとは別のライフサイクルを持つ
- 画面回転などでActivityが再生成されても、ViewModelのデータは保持される
- UIロジックをViewModelに集約することで、コードが見やすく保守しやすくなる
📦 JavaでのViewModel例(簡易)
public class MyViewModel extends ViewModel {
private final MutableLiveData<String> text = new MutableLiveData<>();
public LiveData<String> getText() {
return text;
}
public void setText(String value) {
text.setValue(value);
}
}
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getText().observe(this, value -> textView.setText(value));
🔁 LiveData とは?
LiveData
は、変更を監視できるデータホルダーです。
observe()
を使うと、UIが自動的にデータ更新を受け取れる- ライフサイクルを認識しているため、Activity/Fragmentが非表示のときは通知を止めてくれる
特徴まとめ:
特徴 | 説明 |
---|---|
オブザーバブル | データ変更時に通知を受けられる(Observerパターン) |
ライフサイクル感知型 | 画面が非表示のときは自動で通知を止める |
ViewModelと相性抜群 | ViewModel内の状態をLiveDataで公開するのが一般的 |
🔗 DataBinding とは?
DataBinding
は、XMLレイアウトとViewModelのデータを直接バインディング(紐づけ)する仕組みです。
通常、データを表示するために次のようなコードを書きます:
textView.setText(viewModel.getText().getValue());
これを XMLに直接書けるようにするのがDataBindingです。
✅ DataBindingのメリット
findViewById()
を使わなくても済む- UI更新が自動で行われ、コードがスッキリする
- Viewとデータのつながりが宣言的になる
XML側の例:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.MyViewModel" />
</data>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.text}" />
</layout>
Java側でのセットアップ:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setViewModel(viewModel);
binding.setLifecycleOwner(this);
🤝 3つの関係性まとめ(図でイメージ)
[ View (XML) ]
↑
DataBinding
↑
[ LiveData <-> ViewModel ]
- ViewModelがデータを保持
- LiveDataで変更を通知
- DataBindingでViewと自動連携
🎓 まとめ(学習のポイント)
技術 | 学ぶ意義 |
---|---|
ViewModel | UIとは独立して状態管理できる(画面回転に強い) |
LiveData | 安全で効率的なデータ通知が可能 |
DataBinding | UI更新を省力化し、コードとレイアウトの分離が進む |