Closed4
作業ログ 2021/03/22
Kotlinスタディ
- 引き続き書籍でスタディ
- Mastodonクライアント作成
つまづきポイント
-
startActivityForResult
がdeprecated
になってた -
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にクローズされました