22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android Jetpack(AndroidXライブラリ)の最近の更新

Last updated at Posted at 2019-09-17

AndroidXライブラリの更新情報を眺めていろいろ機能を触ったのでまとめたいと思います。

最近の定義は恣意的なのでご了承ください。

Navigation

deeplink

<deeplink>タグによってUriを元にNavigationを開けるようになります。

dialog

<dialog>タグにDialogFragmentを登録すれば、Navigationからダイアログを表示できます。

Room(SQLite)

コルーチン対応

room-ktxがsuspendメソッドに対応しました。

@Query("SELECT * FROM Status where count = :count")
suspend fun find(count: Int): Status? 

Lifecycle

ViewModelの初期化

以前はViewModelの取得では

private val viewModel by lazy { ViewModelProviders.of(this).get<MainViewModel>() }

と記述していましたが、ViewModelProvidersはDeprecatedになりました。

activity-ktxfragment-ktxに追加されたactivityViewModelsviewModels

private val activityViewModel: ActivityViewModel by activityViewModels()
private val fragmentViewModel: FragmentViewModel by viewModels()

と記述するようにします。

JavaからはViewModelProviderを直接使用して

MainViewModel viewModel = new ViewModelProvider(getViewModelStore(), getDefaultViewModelProviderFactory()).get(MainViewModel.class);

という感じです。

ViewModelに引数を渡したい場合はViewModelProvider.NewInstanceFactoryを継承して

定義側
class YearMonthViewModel(val yearMonth: YearMonth) : ViewModel() {
    class Factory(private val yearMonth: YearMonth) : ViewModelProvider.NewInstanceFactory() {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass != YearMonthViewModel::class.java)
                return super.create(modelClass)
            @Suppress("UNCHECKED_CAST")
            return YearMonthViewModel(yearMonth) as T
        }
    }
}
呼び出し側
private val viewModel: YearMonthViewModel by viewModels {
    
YearMonthViewModel.Factory(YearMonthFragmentArgs.fromBundle(requireArguments()).yearMonth)
}

というようにFactoryクラスを使って初期化します。

ViewModel.viewModelScope

viewmodel-ktx 2.1.0で導入されるviewModelScopeを使えばCoroutineScopeを実装しなくてよくなる

上記の記事のとおりです。

ViewModelでコルーチンが使いやすくなります。

2.2.0ではlifecycleScopeも追加されてFragmentなどからも使えます。

LiveData-ktx

val time: MutableLiveData<LocalTime> = MutableLiveData()
val timeText = Transformations.map(time) { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }
val timeText2 = time.map { it.format(DateTimeFormatter.ISO_LOCAL_DATE) }

timeText2のようにTransformationsを使わず、LiveDataに直接mapを行うようなラッパーがlivedata-ktxに追加されました。地味に可読性が向上します。

22
15
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
22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?