Activity間でデータを渡したいケースでIntentを使うケースを試しましたが、Global変数を使うという事もできます。
2021.1.1
グローバル変数
いきなりですが、Singletonで作れるのであれば、あえてこのやり方をとることはないとは思います。
Note: There is normally no need to subclass Application. In most situations, static singletons can provide the same functionality in a more modular way.
Ref: Application | Android Developers
setter(),getter()など今では古いやり方も使いますし、こういうのもあると覚えておくと古いコードのメンテナンスに役立つかもしれません
android.app.Applicationを継承したクラス
Activityのライフサイクルとは別にApplication内でのデータ共有を行うためにandroid.app.Applicationがあります。
これを継承したクラスを作ってAndroidManifestに登録して、メソッドとしてsetter(), getter()を作成しておき、Activityから設定、読み出しを行います。
MyAppという名前でandroid.app.Applicationを継承したクラスを生成します。またデータの読み書きができるメソッドを作っておきます。
これから作っていく全体像としては、MainActivityとSubActivityから独立したクラスMyAppというものを設定して、そのプロパティとして例えばtestStringがあります。これに対してそれぞれのActivityからアクセスして読み書きをするわけです。
MyApp.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//package your.package.name; import android.app.Application; public class MyApp extends Application { private String testString = "default"; @Override public void onCreate() { super.onCreate(); } public String getTestString() { return testString; } public void setTestString(String str) { testString = str; } } |
AndroidManifestへの登録
先に作成したクラスをandroid:nameに設定します。
追加で遷移先のSubActivityも使うので登録
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application android:name=".MyApp" ... android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> ... </activity> <!-- 後から追加するActivity--> <activity android:name=".SubActivity"/> </application> </manifest> |
Activityからの呼び出し
グローバル変数への書き込みのメソッドができているので、アプリケーションクラスのインスタンスを生成してそのメソッドを呼びます。
ButtonのタップでEditTextで入力した文字列をグローバル変数として登録してSubActivityへ遷移。MainActivityからSubActivityへ遷移するところはIntentを使っています。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private MyApp myApp; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myApp = (MyApp) this.getApplication(); editText = findViewById(R.id.edit_text); Button buttonMain = findViewById(R.id.button_main); buttonMain.setOnClickListener( v -> { String message = editText.getText().toString(); myApp.setTestString(message); Intent intent = new Intent(getApplication(), SubActivity.class); startActivity( intent ); }); } } |
getApplication()を使ってMyAppインスタンスを生成して、そのグローバル変数の読み出しメソッドからテキストを読みだして表示します。
SubActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//package your.packagename; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class SubActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); MyApp myApp = (MyApp) this.getApplication(); String str = myApp.getTestString(); TextView textViewSub = findViewById(R.id.textview_sub); textViewSub.setText(str); } } |
レイアウトファイルです。
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#def" tools:context=".MainActivity"> <TextView android:text="@string/main" android:textSize="30sp" android:background="#88f" android:gravity="center" android:layout_margin="30dp" android:padding="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:gravity="center" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <EditText android:gravity="center" android:id="@+id/edit_text" android:inputType="text" android:textSize="30sp" android:hint="@string/hint" android:autofillHints="@string/hint" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button_main" android:text="@string/button" android:textSize="30sp" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> |
activity_sub.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#dfe" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="@string/sub" android:textSize="30sp" android:background="#8c8" android:gravity="center" android:layout_margin="30dp" android:padding="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:gravity="center" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > <TextView android:id="@+id/textview_sub" android:textSize="30sp" android:textColor="#000" android:layout_marginBottom="50dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> |
strings.xml
1 2 3 4 5 6 7 |
<resources> <string name="app_name">YourAppName</string> <string name="main">Main Activity</string> <string name="hint">input anything you like</string> <string name="button">Button</string> <string name="sub">Sub Activity</string> </resources> |
Android Studioのプロジェクトで作成あるいは変更したファイルです。
サンプル動画
Actvityが複数あり、変数を共有したい場合には役立つかもしれませんが注意点もあります。
今更ですが可読性が落ちるとかバグの温床だとか悪者扱いされやすいのです。簡単なプロジェクトであればそれほどでもありませんが大規模なプロジェクトでは敬遠されます。
ということも心に留めておきましょう。
Reference:
Application | Android Developers