Androidアプリにおける画面遷移の際に変数(値)を渡す方法をサンプルコード(Kotlin)とともに紹介します。KotlinでもJavaのときと同様にIntentを活用することで実装できます。
画面遷移とデータ受け渡しのポイント
Androidの画面遷移ではIntentクラスがポイントとなります。
順序は以下の通り。
- Intentクラスをnewする
- 画面遷移先(これから起動するアクティビティ)に渡すデータを格納する(putExtra)
- アクティビティを起動する(startActivity)
この方法に関しては、JavaでもKotlinでも同じですね。
サンプルコード(Kotlin)
以下のようなアプリを作成しました。
機能は、メインアクティビティで入力したテキストをサブアクティビティで受け取って表示する、です。
サブアクティビティにはメインに戻るためのボタンも配置されています。
GUIとソースコードの紐づけはView Bindingを使っています。方法は以下記事を参考にしてください。
(本記事の画面遷移の方法自体はfindViewByIdを使用していてもできます)
今はfindViewByIdではなく、View Bindingが推奨されているようです。
Manifestを編集する
サブアクティビティのファイル(xmlとKotlinのファイル)を作成して、コードを作成しても実はサブアクティビティを表示することはできません。
AndroidManifest.xmlにサブアクティビティの存在を認識させるために編集する必要があります。
AndroidManifest.xmlはアプリの実行に必要な設定が記されているファイルです。
以下追記をします。
<application> <!-- 省略 --> <activity android:name=".MainActivity" android:exported="true"> <!-- 省略 --> </activity> <!-- ★追記★ --> <activity android:name=".SubActivity" > </activity> </application>
これでサブアクティビティを使う準備ができました。
MainActivity
XMLは以下の通り。
EditTextに入力された値をサブアクティビティに渡します。
<TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff0" android:text="Value to SubActivity:"/> <EditText android:id="@+id/etInput" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btGosub" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Go SubActivity" android:layout_gravity="center" />
Kotlinのコードは以下の通り。
画面遷移に関係するのはボタンクリックのリスナー(20行以降)です。
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //Binding関連 binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) //ボタンのインスタンス val btnListener = BtnListener() //ボタンにリスナ追加 binding.btGosub.setOnClickListener(btnListener) } //リスナクラス private inner class BtnListener:View.OnClickListener{ override fun onClick(v: View) { val intent = Intent(this@MainActivity,SubActivity::class.java) // 渡す値をIntentに格納 intent.putExtra("MainText", binding.etInput.text.toString()) // サブアクティビティを起動 startActivity(intent) } } }
SubActivity
XMLは以下の通り。
メインアクティビティからの値はEditTextで受け取ります。
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#0f0" android:text="From MainActivity" /> <EditText android:id="@+id/etSub" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Space android:layout_width="wrap_content" android:layout_height="20pt"/> <Button android:id="@+id/btBackMain" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Back to MainActivity" />
Kotlinは以下の通り。
13行あたりでメインアクティビティからの要素を受け取っています。
class SubActivity :AppCompatActivity(){ private lateinit var binding: ActivitySubBinding override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) //Binding関連 binding = ActivitySubBinding.inflate(layoutInflater) var view = binding.root setContentView(view) // Mainからの変数の受け取り val fromMain_text = intent.getStringExtra("MainText") // 受け取った変数をEditTextに代入 binding.etSub.setText(fromMain_text) // ボタンのインスタンス val btnListener_sub = BtnListenersub() // ボタンにリスナを追加 binding.btBackMain.setOnClickListener(btnListener_sub) } //ボタンのリスナクラス private inner class BtnListenersub:View.OnClickListener{ private lateinit var binding: ActivitySubBinding override fun onClick(v: View) { // サブアクティビティを終了する finish() } } }
アクティビティを終了する際は、finish()を使用します。
まとめ
Intentを使って、渡したい要素を格納して、startActivity、というJavaと同じ方法でできます。
スマホの画面は狭いので、画面遷移を有効に活用したいですね。
本記事の発展版↓。遷移先画面から値を受け取る方法。
他Android記事。
コメント