15
3

More than 1 year has passed since last update.

registerForActivityResultで「attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.」

Last updated at Posted at 2021-04-01

「AndroidX Activity 1.2.0-alpha02 と Fragment 1.3.0-alpha02」で導入されたregisterForActivityResultを使ってみようと思って、実装してみました。

build.gradle
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation "androidx.activity:activity-ktx:1.2.2"

    testImplementation 'junit:junit:4.+'

    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
MainActivity.kt
class MainActivity : AppCompatActivity() {

    private val binding: ActivityMainBinding by lazy {
        DataBindingUtil.setContentView(this, R.layout.activity_main)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding.button.setOnClickListener {
            clickButton()
        }
    }

    private fun clickButton() {

        val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            Toast.makeText(this, "SubActivityから戻ってきた", Toast.LENGTH_SHORT).show()
        }

        startForResult.launch(Intent(this, SubActivity::class.java))
    }
}

実行してボタンをクリックすると、

java.lang.IllegalStateException: 
LifecycleOwner XXXX is attempting to register while current state is RESUMED. 
LifecycleOwners must call register before they are STARTED.

というエラーでクラッシュした。

いろいろ調べてみると、registerForActivityResultをフィールドとして定義しないとダメっぽい。

修正↓

class MainActivity : AppCompatActivity() {

    // 修正箇所
    private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        Toast.makeText(this, "SubActivityから戻ってきた", Toast.LENGTH_SHORT).show()
    }

    private val binding: ActivityMainBinding by lazy {
        DataBindingUtil.setContentView(this, R.layout.activity_main)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding.button.setOnClickListener {
            clickButton()
        }
    }

    private fun clickButton() {
        startForResult.launch(Intent(this, SubActivity::class.java))
    }
}

これでよしと思ったら、またクラッシュ。

再度調べてみるとbuild.gradleimplementation "androidx.fragment:fragment-ktx:1.3.2"が足りなかった。(Fragment作らないからandroidx.activity:activity-ktx:1.2.2だけで良いかと思ってた...)

修正↓

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation "androidx.activity:activity-ktx:1.2.2"
    // 追加
    implementation "androidx.fragment:fragment-ktx:1.3.2"

    testImplementation 'junit:junit:4.+'

    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
15
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
3