SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門

【Android開発中級者に贈るJetpack入門】UIのデータを管理するViewModelとは?

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門 第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ViewModelの作り方

 次に、ViewModelの作り方を紹介していきます。

ViewModelを継承

 ViewModelは一つのクラスとして定義します。その際、androidx.lifecycle.ViewModelクラスを継承します。そして、先述のように、ViewModelはアクティビティに寄り添うように存在することから、原則、一つのアクティビティクラスに対して一つ作成します。

 例えば、MainActivity用のViewModelは、MainViewModelとするように、対応関係がわかるようにしておきます。

クラスメンバはUIのデータ処理を記述

 ViewModelクラスのメンバとしては、相方となるアクティビティに必要なデータを踏まえた上で、以下のものを定義します。

  • UIで扱うデータのprivateフィールド
  • 上記フィールドのセッタとゲッタ(アクセサメソッド)
  • UIの入出力に必要なデータをやり取りするためのメソッド

 例えば、前節で紹介した足し算アプリのMainActivity用のViewModelであるMainViewModelは、Javaではリスト1のようなコードとなります。

リスト1:足し算アプリのMainViewModel(Java版)
public class MainViewModel extends ViewModel {
	private int _num1 = 0;  // (1)
	private int _num2 = 0;  // (2)
	public int getAns() {  // (3)
		return _num1 + _num2;
	}
	public String getAnsStr() {  // (4)
		String ansStr = "";
		if(getAns() != 0) {
			ansStr = String.valueOf(getAns());
		}
		return ansStr;
	}
	public String getNum1Str() {  // (5)
		String num1Str = "";
		if(_num1 != 0) {
			num1Str = String.valueOf(_num1);
		}
		return num1Str;
	}
	public void setNum1Str(String num1Str) {  // (6)
		if(num1Str.equals("")) {
			_num1 = 0;
		}
		else {
			_num1 = Integer.parseInt(num1Str);
		}
	}
	public String getNum2Str() {  // (7)
		String num2Str = "";
		if(_num2 != 0) {
			num2Str = String.valueOf(_num2);
		}
		return num2Str;
	}
	public void setNum2Str(String num2Str) {  // (8)
		if(num2Str.equals("")) {
			_num2 = 0;
		}
		else {
			_num2 = Integer.parseInt(num2Str);
		}
	}
	public int getNum1() {  // (9)
		return _num1;
	}
	public void setNum1(int num1) {  // (9)
		_num1 = num1;
	}
	public int getNum2() {  // (9)
		return _num2;
	}
	public void setNum2(int num2) {  // (9)
		_num2 = num2;
	}
}

 足し算アプリでは、入力された2個の数値が、フィールドとして定義される必要があります。これらを定義しているのが(1)の_num1と(2)の_num2です。そして、それぞれのアクセサメソッドが(9)です。さらに、これらのフィールドをもとに足し算処理を行なっているのが(3)です。

 ただし、EditTextにしても、TextViewにしても、実際に画面とのデータのやり取りは文字列です。そのため、文字列と整数値とのやり取りを可能にしているメソッドが(4)〜(8)です。(4)が足し算結果を文字列に変換しているメソッドです。

 (5)と(6)が_num1に対しての文字列と整数値の相互変換、(7)と(8)が_num2に対しての文字列と整数値の相互変換のメソッドです。それぞれのメソッドにおいて、文字列が空文字("")の場合や整数値が0の場合などの処理も含め、問題なくデータを受け取ったり表示したりできるようにしています。

Kotlinはプロパティを利用

 Kotlinコードでも、ViewModelは同様の作りとなり、リスト2のようになります。

リスト2:足し算アプリのMainViewModel(Kotlin版)
class MainViewModel : ViewModel() {
	var num1 = 0  // (1)
	var num2 = 0  // (2)
	fun getAns(): Int {  // (3)
		return num1 + num2;
	}
	fun getAnsStr(): String {  // (4)
		var ansStr = ""
		if(getAns() != 0) {
			ansStr = getAns().toString()
		}
		return ansStr
	}
	fun getNum1Str(): String {  // (5)
		var num1Str = ""
		if(num1 != 0) {
			num1Str = num1.toString()
		}
		return num1Str
	}
	fun setNum1Str(num1Str: String) {  // (6)
		if(num1Str.equals("")) {
			num1 = 0
		}
		else {
			num1 = num1Str.toInt()
		}
	}
	fun getNum2Str(): String {  // (7)
		var num2Str = ""
		if(num2 != 0) {
			num2Str = num2.toString()
		}
		return num2Str
	}
	fun setNum2Str(num2Str: String) {  // (8)
		if(num2Str.equals("")) {
			num2 = 0
		}
		else {
			num2 = num2Str.toInt()
		}
	}
}

 リスト2のJavaコードをそのままKotlinコードに置き換えたような内容になっていますが、1点大きく違うのが、アクセサメソッドがないことです。Kotlinの場合は、(1)と(2)のようにプロパティを定義するだけで、自動的にアクセサメソッド経由でのデータのやり取りとなるからです。

 他のコードは、Javaコードと同じく、(3)が足し算処理を行うメソッドであり、(4)がその結果の文字列を取得するメソッドです。(5)と(6)がnum1に対しての文字列と整数値の相互変換メソッド、(7)と(8)がnum2に対しての文字列と整数値の相互変換メソッドです。

 このように、ViewModelを定義すると、UIに必要なデータとその処理が、全てViewModelクラスに記述されることになります。

次のページ
ViewModelの利用

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16909 2023/02/17 16:41

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング