どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

画面を追加する(Activity)

Activityを追加する

最小単位で必要な作業は以下2つ。

  1. AppComatActivity を継承したクラスを新規作成する。
  2. 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を生成する。 ActivityResultLauncherregisterForActivityResultを利用する。

  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:がタップされました"
  }

生成したActivityResultLauncherCustomActivityを開始する。

  findViewById<View>(R.id.button_register_activity_for_result).setOnClickListener {
    val intent = Intent(context, CustomActivity::class.java)
    activityResultLauncher.launch(intent)
  }

補足:startActivityForResultについて

startActivityForResultActivityResultLauncherが追加される前に利用されていた機能で、現在はdeprecated(非推奨)となっている。

参考

最終更新: 2025.6.24