画面を追加する(Activity)
Activityを追加する
最小単位で必要な作業は以下2つ。
AppComatActivity
を継承したクラスを新規作成する。AndroidManifest.xml
に定義を追加する。
Activityクラスの新規作成
AppComatActivity
を継承したクラスを追加する。
例えば、CustomActivity
を実装する。
実装はどこでも問題ないが、Activityであれば専用のファイル(CustomActivity.kt
)を作成するのが自然。
class CustomActivity : AppCompatActivity() {
}
AndroidManifest.xmlに定義の追加
前項で実装したCustomActivity
の定義をAndroidManifest.xml
に追加する。
定義は<application>
タグ内に追加する。
<application
...
...>
<activity android:name="com.mkt120.sampleapplication.CustomActivity" />
</application>
新規プロジェクトを作成すると、MainActivity
がすでに定義されているので、それを参考にすると良い。
Activityを開始する
startActivity
を使う。
例えばボタンをタップした時に、1つめの画面(MainActivity
)から2つめの画面(CustomActivity
)を開始する場合は以下。
findViewById<View>(R.id.button_start_activity).setOnClickListener {
val intent = Intent(context, CustomActivity::class.java)
startActivity(intent)
}
Activityを開始し、その結果を受け取る
ActivityResultLauncher.launch
を使う。
2つめのActivity
の処理結果を1つめのActivity
で受け取りたい場合、startActivity
で開始すると結果を受け取ることができない。
ActivityResultLauncher.launch
を使ってActivity
を開始し、2つめのActivity
の処理結果を受け取る処理を実装しておく。
例えば2つめの画面として、CustomActivity
を以下のように実装する。
class CustomActivity : AppCompatActivity() {
companion object {
const val EXTRA_RESULT_DATA = "extra_result_data"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_startactivity_custom)
val button1 = findViewById<Button>(R.id.button_1)
button1.setOnClickListener {
// 処理結果をintentに設定してActivityを終了する
val data = Intent().apply {
putExtra(EXTRA_RESULT_DATA, button1.text.toString())
}
setResult(RESULT_OK, data)
finish()
}
val button2 = findViewById<Button>(R.id.button_2)
button2.setOnClickListener {
// 処理結果をintentに設定してActivityを終了する
val data = Intent().apply {
putExtra(EXTRA_RESULT_DATA, button2.text.toString())
}
setResult(RESULT_OK, data)
finish()
}
}
}
res/activity_startactivity_custon.xml
として以下を追加する。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="wrap_content"
android:text="ボタン1"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:text="ボタン2"
android:layout_height="wrap_content"/>
</LinearLayout>
1つ目の画面でCustomActivity
を開始するため、ActivityResultLauncher
を生成する。
ActivityResultLauncher
はregisterForActivityResult
を利用する。
private val activityResultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
if (result.resultCode != RESULT_OK) {
// キャンセルされた
return@registerForActivityResult
}
val data = result.data?.getStringExtra(CustomActivity.EXTRA_RESULT_DATA)
val textView = findViewById<TextView>(R.id.text_view_result)
textView.text = "$data:がタップされました"
}
生成したActivityResultLauncher
でCustomActivity
を開始する。
findViewById<View>(R.id.button_register_activity_for_result).setOnClickListener {
val intent = Intent(context, CustomActivity::class.java)
activityResultLauncher.launch(intent)
}
補足:startActivityForResultについて
startActivityForResult
はActivityResultLauncher
が追加される前に利用されていた機能で、現在はdeprecated(非推奨)となっている。
参考
最終更新: 2025.6.24