Androidアプリでページ遷移するときにデータを渡す方法2つ【Java】

android共通イメージ画像
※開発環境としてAndroid Studioを使用しています。記載内容がAndroid Studio前提になっている可能性があります。

Androidアプリでは各ページが独立しているので前のページで使用したデータを次のページでも使用したい場合にはデータを渡す方法を用意する必要があります。その方法をまとめます。

データを渡す方法2つ

Intentで渡す

Intent(インテント)とは、Activity(別のページ等)を起動するときに使用するオブジェクトです。インテントにデータをセットしてそのまま次のページに渡すことができます。

まずは渡す側のコードです。


//Intentのインスタンス作成 - new Intent(現在のコンテキスト, 移動先のアクティビティ);
Intent i = new Intent(NowActivity.this, NextActivity.class);

//渡すデータをセット - putExtra(保存するキー名(自由に設定), 保存する値);
i.putExtra("sampleString", "Ethan");
i.putExtra("sampleInt", 0);

//別のページを起動
startActivity(i);

データ型に関わらずputExtra(キー, 値)でデータをセットします。

次に受け取る側のコードです。


//インテントを呼び出す
Intent i = getIntent();

//保存した値を受け取る
//String - getStringExtra(保存したキー名)
String sampleString = i.getStringExtra("sampleString");

//int - getIntExtra(保存したキー名, 読み込めなかった場合のデフォルト値)
int sampleInt = i.getIntExtra("sampleInt", -1);

// データを受け取った結果
// sampleString => "Ethan"
// sampleInt => 0 (受け取るキーを間違えていた場合などは指定したデフォルト値の-1)

セットしたデータの型に応じて、getStringExtra(キー)getIntExtra(キー, デフォルト値)で受け取ります。

Intentでオブジェクトを渡すには?

Intentでオブジェクトをそのまま渡すことはできませんが、Serializableを使うことで可能になります。

例として、Exampleクラスを別のページに渡したいとします。その場合、ExampleクラスにSerializableをimplementsします。


import java.io.Serializable;
class Example implements Serializable
{
	private String sampleString;
	private int sampleInt;
	
	public Example(){}
	
	public void setSampleString(String sampleString){
		this.sampleString = sampleString;
	}
	public void setSampleInt(int sampleInt){
		this.sampleInt = sampleInt;
	}
	public String getSampleString(){
		return this.sampleString;
	}
	public int getSampleInt(){
		return this.sampleInt;
	}
}

こうすることでExampleクラスのオブジェクトをIntentにセットして渡すことができるようになります。

まずは渡す側のコードです。


//Exampleクラスのインスタンス作成
Example example = new Example();

//Exampleクラスに値をセット
example.setSampleString("Ethan");
example.setSampleInt(0);

//Intentのインスタンス作成 - new Intent(現在のコンテキスト, 移動先のアクティビティ);
Intent i = new Intent(NowActivity.this, NextActivity.class);

//渡すデータをセット - putExtra(保存するキー名(自由に設定), 保存する値);
i.putExtra("sampleObject", example);

//別のページを起動
startActivity(i);

通常のデータと同じようにputExtra(キー,値)でセットします。

次に受け取る側のコードです。


//インテントを呼び出す
Intent i = getIntent();

//保存した値を受け取る
//Example - getSerializableExtra(キー名)
Example example = (Example)i.getSerializableExtra("sampleObject");

//中のデータを展開
String sampleString = example.getSampleString();
int sampleInt = example.getSampleInt();

// データを受け取った結果
// sampleString => "Ethan"
// sampleInt => 0

getSerializableExtra(保存したキー名)で受け取り、Exampleクラスの型なので(Example)とキャストします。

SharedPreferencesで保存して読み込む

SharedPreferencesとはAndroidに備えてあるデータを保存する機能です。アプリ内にxmlファイルで保存します。

前述のIntentとの違いはページを閉じてもデータが保存されている点です。単に次のページにデータを渡すだけのような処理には必要ありません。

まずはデータを保存するコードです。


//SharedPreferencesのインスタンス取得 - (保存するファイル名, モード(MODE_PRIVATE => このアプリからのみ読み書き可能))
SharedPreferences sp = getSharedPreferences("sampleSaveFile", MODE_PRIVATE);

//保存するデータをセット
//String - edit().putString(保存するキー名(自由に設定), 値).apply();
sp.edit().putString("sampleString", "Ethan").apply();

//int - edit().putInt(保存するキー名(自由に設定), 値).apply();
sp.edit().putInt("sampleInt", 0).apply();

これでアプリ内に保存が完了します。

次にデータを読み込むコードです。


//SharedPreferencesのインスタンス取得 - (保存したファイル名, モード(MODE_PRIVATE => このアプリからのみ読み書き可能))
SharedPreferences sp = getSharedPreferences("sampleSaveFile", MODE_PRIVATE);

//Stringデータの取得 - getString(保存したキー名, デフォルトの値);
String sampleString = sp.getString("sampleString", "");

//intデータの取得 - getInt(保存したキー名, デフォルトの値);
int sampleInt = sp.getInt("sampleInt", -1);

// データを受け取った結果
// sampleString => "Ethan" (読み込めなかった場合は指定したデフォルト値の"")
// sampleInt => 0 (読み込めなかった場合は指定したデフォルト値の-1)

保存したデータの型に応じて、getString(キー, デフォルト値)getInt(キー, デフォルト値)で読み込みます。

SharedPreferencesでオブジェクトを渡すには?

SharedPreferencesにオブジェクトをそのまま保存することはできませんが、GSONを使うことで可能になります。

GSONとは、googleが提供するJSONデータとJavaオブジェクトを変換するライブラリです。保存したいオブジェクトを一度JSON形式に変換してxmlファイルに保存します。

※GSONはそのままでは使用することができません。build.gradle(:app)にGSONを使用するための記述が必要です。


dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    
    implementation 'com.google.code.gson:gson:2.8.6'
}

一番下の一行が追加したGSONの記述です。build.gradleの変更後は必ず「今すぐ同期」をしてください。同期しないと変更が反映されません。

そして、保存する側のコードです。ここでもExampleクラスを例として使用しますが、Intentで渡す場合と違いSerializableをimplementsしてある必要はありません。


////Exampleクラスのインスタンス作成
Example example = new Example();

//Exampleクラスに値をセット
example.setSampleString("Ethan");
example.setSampleInt(0);

//GSONのインスタンスを作成
Gson gson = new Gson();

//SharedPreferencesのインスタンス取得 - (保存するファイル名, モード(MODE_PRIVATE => このアプリからのみ読み書き可能))
SharedPreferences sp = getSharedPreferences("sampleSaveFile", MODE_PRIVATE);

//保存するデータをセット
//Object - edit().putString(保存するキー名(自由に設定), gson.toJson(保存するオブジェクト)).apply();
sp.edit().putString("sampleObject", gson.toJson(example)).apply();

オブジェクトをtoJsonでJSON形式に変換して、putStringで文字列として保存しています。

これでアプリ内に保存が完了します。

次にデータを読み込むコードです。


//GSONのインスタンスを作成
Gson gson = new Gson();

//SharedPreferencesのインスタンス取得 - (保存したファイル名, モード(MODE_PRIVATE => このアプリからのみ読み書き可能))
SharedPreferences sp = getSharedPreferences("sampleSaveFile", MODE_PRIVATE);

//データの読み込み - fromJson( getString(保存したキー, デフォルトの値), Jsonから変換後のデータの型)
Example example = gson.fromJson(sp.getString("sampleObject",""), Example.class);

//中のデータを展開
String sampleString = example.getSampleString();
int sampleInt = example.getSampleInt();

// データを受け取った結果
// sampleString => "Ethan"
// sampleInt => 0

SharedPreferencesのgetStringで文字列として読み込んだ後、GsonのfromJsonでJSON形式から変換することでオブジェクトを読み込むことができます。

投稿されたコメント一覧

コメント投稿フォーム

必須項目
任意項目

ウェブサービス一覧