Closed4

作業ログ 2021/03/22

モガンボモガンボ

Kotlinスタディ

  • 引き続き書籍でスタディ
    • Mastodonクライアント作成
モガンボモガンボ

つまづきポイント

  • startActivityForResultdeprecatedになってた
  • registerForActivityResultを使用すると良いらしい
  • Activityから呼ぶ場合は直前で呼んでも問題ない?(未検証)
  • Fragmentから呼ぶ場合は一工夫必要 (下記参照)
    // lateinit で ActivityResultLauncherを定義
    private lateinit var startForResult: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略

        // onCreate内で処理を作成
        startForResult =
                registerForActivityResult(StartActivityForResult()) { result: ActivityResult? ->
                    if (result?.resultCode == Activity.RESULT_OK) {
                        Log.d(TAG, "result OK")
                        // RESULT_OKで返ってきた際の処理
                    }
                }
    }

    // 実際の呼び出し
    private fun launchOtherActivity() {
        // インテント作成
        val intent = OtherActivity.newInstance(requireContext())
        // onCreateで初期化したActivityResultLauncherで起動
        startForResult.launch(intent)
    }
モガンボモガンボ

LifecycleObserverについて

  • どうやらJava8だとLifeCycleObserverよりもDefaultLifecycleObserverを使用した方がいいらしい

設定方法

Gradleに下記ライブラリ追加

    def lifecycle_version = "2.3.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

置き換え

class TestViewModel(
    application: Application
) : AndroidViewModel(application), LifecycleObserver {

    // 省略

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
        coroutineScope.launch {
            userCredential = userCredentialRepository
                .find(instanceUrl, username) ?: return@launch
            tootRepository = TootRepository(userCredential)
            accountRepository = AccountRepository(userCredential)
            loadNext()
        }
    }
}

class TestViewModel(
    application: Application
) : AndroidViewModel(application), DefaultLifecycleObserver {

    // 省略

    override fun onCreate(owner: LifecycleOwner) {
        Log.d(TootListViewModel::class.java.simpleName, "onCreate")
        super.onCreate(owner)
        coroutineScope.launch {
            userCredential = userCredentialRepository
                .find(instanceUrl, username) ?: return@launch
            tootRepository = TootRepository(userCredential)
            accountRepository = AccountRepository(userCredential)
            loadNext()
        }
    }
}

普通のonCreateみたいにoverrideする形なのでわかりやすそう

このスクラップは2021/03/23にクローズされました