【MVVM】ViewModel インスタンスの取得

以下の記述ですが、


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

Activityで にしろ、Fragmentで にしろ、


private val viewModel: MainViewModel by viewModels()

でいける。

Fragment内で呼び出す場合は、


dependencies {
  implementation 'androidx.fragment:fragment-ktx:1.1.0-alpha08'
}

で、今現在。

コードをみてみる。


@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModels(
    noinline ownerProducer: () -> ViewModelStoreOwner = { this },
    noinline factoryProducer: (() -> Factory)? = null
) = createViewModelLazy(VM::class, { ownerProducer().viewModelStore }, factoryProducer)

@MainThread
inline fun <reified VM : ViewModel> Fragment.activityViewModels(
    noinline factoryProducer: (() -> Factory)? = null
) = createViewModelLazy(VM::class, { requireActivity().viewModelStore }, factoryProducer)

@MainThread
fun <VM : ViewModel> Fragment.createViewModelLazy(
    viewModelClass: KClass<VM>,
    storeProducer: () -> ViewModelStore,
    factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
    val factoryPromise = factoryProducer ?: {
        val application = activity?.application ?: throw IllegalStateException(
            "ViewModel can be accessed only when Fragment is attached"
        )
        AndroidViewModelFactory.getInstance(application)
    }
    return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
}

使ったほうが良いですよね。

はまらなくてすむ。

👉【MVVM】 ViewModel の_プロパティ記述

androidx.fragment.app  |  Android Developers


Android Q beta3 で感じる Navigation Bar (ナビゲーションバー) の方向性

Android端末で、ナビゲーションバーが担当する操作は、以下の5つです。

- ホームへ (Home)
- アプリドロワー表示 (App drawer)
- アプリ切り替え (App switcher)
- 戻る (Back)
- アシスタントアプリ起動 (Assistant)

2019-05-05付で公開された Android Q beta3 では、


「設定」

  |

「システム」

  |

「操作」

  |

「System Navigation」

3タイプに分かれています。

それぞれ試してみましょう。

 

3-button navigation

これまでの、馴染みやすいレガシーなスタイルと言えるでしょう。



これが一番使いやすいと思う私は固執しすぎの保守な人間ですかね?

 

2-button navigation

実はこれが慣れると一番使えるのでは?



現在普及割合を増やしてる「Android P」 とはボタン数は同じだが、アプリ切り替えが少し違う。それがすごく良い。

 

Fully gestural navigation

問題なのはこれ。

今回、最新版の操作として登場してます。



「画面両端からの中向きスワイプ」が「戻る(バック)ボタン」という直感的でない操作に。

それ、各アプリ内ナビゲーションメニューやホームアプリなどと衝突しますし。

「薄っぺらい一つのボタン」を採用することにより、コンテンツスペースを縦方向最大限に確保できてるとはいえどうなんでしょうか。

 

まとめ

フルジェスチャーな1ボタンは辛くねえですか?




スペース空いてるんだし、2ボタンか3ボタンが馴染みやすいように思いますが、果たしてどうなるのか。

👉Android Pie から始まる「ナビゲーションバー」の混乱と操作の覚え方

👉Android Q Beta 3 hands-on: Dark theme, new gestures, and more! - Android Authority


「adb shell getprop」で端末情報を見る

ダッシュボード  |  Android Developers

つぶやきを監視しております。いつもありがとうございます。


やってみる。


~ $ adb shell getprop | grep api
[ro.product.first_api_level]: [25]

「SDK」関連を見てみます。


~ $ adb shell getprop | grep sdk
[ro.bootimage.build.version.sdk]: [28]
[ro.build.version.min_supported_target_sdk]: [23]
[ro.build.version.preview_sdk]: [1]
[ro.build.version.preview_sdk_fingerprint]: [9049062ccadb8a692212952393179260]
[ro.build.version.sdk]: [28]
[ro.qc.sdk.audio.fluencetype]: [fluencepro]
[ro.system.build.version.sdk]: [28]
[ro.vendor.build.version.sdk]: [28]

てか、整数のAPIバージョン数が分からないので、コードネームとの対照を調べる。


23 M                      6             Marshmallow
24 N                      7             Nougat
25 N_MR1                  7.1           Nougat
26 O                      8.0           Oreo
27 O_MR1                  8.1           Oreo
28 P                      9.0           Pie

core/java/android/os/Build.java - platform/frameworks/base - Git at Google

または、アプリ内部から吐かす。


Build.VERSION_CODES::class.declaredMembers.forEach { p ->
  p.isAccessible = true
  Log.d("VERSIONS", "${p.call()} -> ${p.name}")
}


D/VERSIONS: 1 -> BASE
D/VERSIONS: 2 -> BASE_1_1
D/VERSIONS: 3 -> CUPCAKE
D/VERSIONS: 10000 -> CUR_DEVELOPMENT
D/VERSIONS: 4 -> DONUT
D/VERSIONS: 5 -> ECLAIR
D/VERSIONS: 6 -> ECLAIR_0_1
D/VERSIONS: 7 -> ECLAIR_MR1
D/VERSIONS: 8 -> FROYO
D/VERSIONS: 9 -> GINGERBREAD
D/VERSIONS: 10 -> GINGERBREAD_MR1
D/VERSIONS: 11 -> HONEYCOMB
D/VERSIONS: 12 -> HONEYCOMB_MR1
D/VERSIONS: 13 -> HONEYCOMB_MR2
D/VERSIONS: 14 -> ICE_CREAM_SANDWICH
D/VERSIONS: 15 -> ICE_CREAM_SANDWICH_MR1
D/VERSIONS: 16 -> JELLY_BEAN
D/VERSIONS: 17 -> JELLY_BEAN_MR1
D/VERSIONS: 18 -> JELLY_BEAN_MR2
D/VERSIONS: 19 -> KITKAT
D/VERSIONS: 20 -> KITKAT_WATCH
D/VERSIONS: 21 -> LOLLIPOP
D/VERSIONS: 22 -> LOLLIPOP_MR1
D/VERSIONS: 23 -> M
D/VERSIONS: 24 -> N
D/VERSIONS: 25 -> N_MR1
D/VERSIONS: 26 -> O
D/VERSIONS: 27 -> O_MR1
D/VERSIONS: 28 -> P
D/VERSIONS: 10000 -> Q

この端末は API 25 の Nougat(MR1) でデビューしています。

今現在 「28-9.0-Pie」ように見えていますが、実際は、「Q-Preview」です。

Android OS バージョンのコードネームを取得する