Androidアプリでページ遷移するときにデータを渡す方法2つ【Java】
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形式から変換することでオブジェクトを読み込むことができます。
投稿されたコメント一覧