『Welcome to Android Basics in Kotlin』をやった(終)

フラグメント間の共有 ViewModel

4. 共有 ViewModel を作成する

OrderViewModel を作成する

クラスのプロパティで料金と言ってるのに、値段にはセッター メソッドは必要ありません。というのはどうだろうか。意味は通じるけども。

5. ViewModel を使用して UI を更新する

Kotlin プロパティのデリゲートを使用する

変更可能な各(var)プロパティにってなんか変だな
読み取り専用プロパティ(val)と対応させるなら
変更可能なプロパティ(var)のそれぞれにかな
原文からしてeach mutable (var) propertyFor a read-only property (val),なんかいw
これは原文が悪いw 翻訳AIは悪くないw

Kotlin のプロパティ委任委任じゃなくて移譲に統一して欲しいところだな。もしかして意図的に使い分けてるのかな?

activityViewModelsというか共有ViewModelって結局のところ、親にViewModelを持たせて、子であるFragment達で共同で使いましょうねっていう話じゃないの(´・ω・`)?

もしそうだったらFragment(activityViewModel : activityViewModels)みたいなコンストラクタとかxml側で処理出来ないんだろうか? activityViewModelsってクラスだから先頭大文字にならんのか…もしかしてandroidxのパッケージというかクラスはみんなそうなのかな…?

radiogroupのxmlでの設定ってなんか面倒くさいな…
もっと簡略できないのかな?

xml自体はそのままでもいいんだけどscss?みたいな感じで簡略表記したものを自動ジェネレートしてくれるような仕組みはないのだろうか


仕方がないといえば仕方がないのだが、この"E MMM d"だと日本語ロケールでは"土 6月 5"みたいな感じになってしまうw

そこまでの機能も必要性もないのかもしれないけど、翻訳AIに新機能を組み込むならロケールに合わせてこういった表記(それに関わるコード部分)を変更できるようにするってのもありかな。

initブロックって変数宣言の前に置いちゃいけないんだな…( ;・´ω・`)ゴクリッ
正確にはそれらの変数の初期化処理が入ってるというかアクセスしてしまう場合は。
OrderViewModelのところでそれをやって
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.MutableLiveData.setValue(java.lang.Object)' on a null object reference
を食らった(ノ∀`)

エルビス演算子のElvisってどういう意味かなぁ…エルビス・プレスリーとかは関係ないよなぁ…
と思ってたら…まじか(・∀・)

エルビス演算子はエルビス・プレスリーの顔文字 (emoticon) に形が似ていることからこう呼ばれる

って、下に書いてあった(ノ∀`)

豆知識: elvis 演算子(?:)は、ロックスターのエルビス プレスリーにちなんで名付けられました。横向きで見ると、クイッフ スタイルのエルビス プレスリーの絵文字に似ているからです。

なんで android:text="@{@string/subtotal_price(viewModel.price)}"の挿入位置が
fragment_flavor.xmlと残りの2つと違う指示をするのだろうか…

8. 注文の詳細から価格を計算する

LiveData 変換で価格の表示形式を設定する

LiveData.


ナビゲーションとバックスタック

4. タスクとバックスタックについて学ぶ

Cupcake アプリのバックスタックを変更する

なんで次の行とかh2なんだろ?

キャンセルボタンのクリックリスナーを追加する

sharedViewModel.resetOrder().
R.id.action_flavorFragment_to_startFragment.

5. 注文を送信する

sharedViewModel.priceString.value.toString()
priceじゃない? issueの#8と#9にあったわ(ノ∀`)

おかしい…何かを間違えてるのか、一つ注文しても複数形のままだ…
まあいいや(ノ∀`)


コルーチンの概要

4. Kotlin のコルーチン

何が書いてあるかさっぽろわっかない(・∀・)


詳解 Kotlin Coroutinesという電子書籍が第二章まで無料公開されていたので、それを読んで何となく理解し、こちらの方も何となく読み進められた。

**********************************************
"一方で、Kotlin Coroutinesは単一のスレッドを再利用することができます。実行しているCoroutinesがdelay等の中断状態になると、他のCoroutinesを同じスレッドで実行します。これにより、並行に動作し、メモリを効率的に使うことができます。"

いまいちよくわからない(´・ω・`)
コルーチン1の処理①というか中断状態になったスレッドの保持しているデータは何処に行くの(´・ω・`)? 書き込んでいるなら書き込みと読み込みが発生しそうだけど、その時はメモリじゃなくてもっと遅いストレージに書き込む…わけはないよね……

多分スレッドをきちんと理解してないんだな、俺氏(ノ∀`)
昔Javaを弄っていた時は理解していたと勘違いしてたんだな
Javaとかだとスレッドプールだかいうやつで再利用してなかったっけ?

Chapter 02 Coroutinesの基礎を学ぶ
jcenter()ってもう利用不可能だったっけ? ← 読み込みはOK?

"Coroutinesを起動するためには"
何か意図があるわけではないのなら"Kotlin Coroutines"以外では"Coroutine"の単数形で表記した方が良さそうな。なんか併用してるけど、意味が違うんかな?

"Coroutinesを起動するためには、CoroutineScopeが必要です。CoroutineScopeはいくつかの方法で作成することができますが、ここではrunBlockingを使っています。runBlockingは新しいCoroutineScopeを作成し、その中で起動された全てのCoroutineが完了するまで処理をブロックします。"

これがわかってなくて、playgroundでlauchだけを使ってエラーになってたわ(ノ∀`)
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html

"CoroutineScopeはCoroutineContextを指定することで作成することができます。"

runBlockingはデフォルト値でEmptyCoroutineContextを使うのか。

3.コルーチンの説明として正しいものは次のうちどれですか。
コルーチンは実行される場合と実行されない場合がある。
**********************************************

もう既に読み直しても、何の話をしているのかが微妙に分からなくなってる(ノ∀`)
またちゃんと勉強しないとなぁ…


6. インターネットに接続する

MarsApiService.

8. Moshi で JSON レスポンスを解析する

[]を角かっこと呼んでいるなら{}は中かっこではなく波かっこの方が良いような。

ViewModel を更新する

listResult.


インターネットから画像を読み込んで表示する

3. インターネット画像を表示する

バインディング アダプターを使用する

説明がよくわからん(ノ∀`)

画像ビュー
ImageViewは訳してはいけないような

何かを間違えて

java.lang.IllegalStateException: Required DataBindingComponent is null in class GridViewItemBindingImpl. A BindingAdapter in com.example.android.marsphotos.BindingAdapters is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.

というエラーが(ノ∀`)

色々とぐぐったり、チュートリアルを見直すもわからず。
issueにも上がっていない…
つまりは俺氏のミスオペの可能性が高い。

再びエラーメッセージを眺める。よくわからんがstaticじゃないのが問題らしい…
web上の他のBindingAdapterのサンプルやこのエラーメッセージでヒットするページを眺めていると皆objectキーワードを加えて@JvmStaticみたいなのをくっつけて回避している。

そんなことしてたっけかと改めてチュートリアルを眺める…

ん(´・ω・`)?

何かチュートリアルの指示表現が今までの指示表現と違うことに気づく。

( ゚Д゚)ハッ

class BindingAdapters {} は要らないのか Σ(゚∀゚;)
ファイル内には@BindingAdapter("imageUrl")をつけたbindImageが存在すれば良かったんやヽ(`Д´)ノ

これはちょっと引っかかったわ(ノ∀`)


4. RecyclerView で画像のグリッドを表示する

RecyclerView を追加する

1.layout/gridview_item.xml を開きます。viewModel データ変数を削除します。
2. タグ内に、MarsPhoto 型の photo 変数(以下を参照)を追加します。

外でもこういうパターンはあったのかもしれないけれども、この書き方は好ましくないような気がしてきた。
この書き方をするなら、viewModel データ変数を削除します。は一手順として項番2とし、その次を項番3にすべきだろう。

でも、そもそも、ここでの手順はgridview_item.xml内の<data>タグ内の変数 viewModelをphotoに書き換えるだけなのだから、わざわざ削除後に追加するように指示する意味はないというか冗長だと思う。

1.layout/gridview_item.xml を開きます。
2.データ変数 viewModel を MarsPhoto 型の photoに書き換えます。
(データ変数は<data>タグ内の<variable>要素のことです。)

みたいな感じの方がいいんじゃね( ゜σ・゚)ホジホジ?

注: この時点で RecyclerView Codelab を復習することをおすすめします。
というならリンク貼っといてよと思ったw

この辺も余り理解せずに、写経ですらない、貼経というか御札貼り的作業になる(ノ∀`)

4. RecyclerView で画像のグリッドを表示する

写真グリッド アダプターを追加する

ListAdapter(リフレッシャー)

ListAdapter.

引き続き onCreateViewHolder() の PhotoGridAdapter クラス内で
逆?

バインディング アダプターを追加して要素を接続する

adapter.

5.RecyclerView にエラー処理を追加する

Kotlin の enum クラス

} catch (e: Exception)
"{"抜け

ステータス ImageView のバインディング アダプターを追加する

enum 状態のセットを使用して、OverviewViewModel に MarsApiStatus を設定しました。
こういう自動翻訳部分が多いけれど、こういう地味に意味の伝わらない文章が脳を疲弊させ、理解の妨げになるんだろうなと思ったけど、原文はYou have set up the MarsApiStatus in the OverviewViewModel, using a set of enum states.か…
直訳ならあながち間違いではないのか…

OverviewViewModelクラス内に、ダウンロードの状態を表す列挙型 MarsApiStatusを設定しました。(列挙型とは、状態を識別させる為の列挙子(定数)を集めたものです。)
だとちょっと違うか…

原文のニュアンスを重視するなら状態のセットを表す列挙型(enum)を使用して、~か?

com.example.android.marsrealestate.overview.MarsApiStatus
というimportはパスが違う?
自動でOverviewViewModel.MarsApiStatus?という形になるな…

import com.example.android.marsphotos.overview.MarsApiStatus
を追加しても上手く行かない…

enumにpublicとかつけないと駄目なのか…?

あ、OverviewViewModel.ktでenumの宣言をOverviewViewModelクラス内でしてたわ(ノ∀`)
前も似たようなミスをしたなw
早くkotlinの書き方に慣れないといけないな。


まあなんやかんやで色々と勉強になったのだけれども、すぐに忘れちゃうし、応用できるレベルではないので引き続き勉強して行こうかな。

しかしながらにしてcodelabの遅さはなんだろうかな。
うちのネット環境だけの問題にしては遅すぎるような気がした。

kotlinは楽でいいなと思う反面、ここから入って行った人はJavaとかで苦労したりするのではないかと思わぬこともないw
昔よりかは楽になっているんだろうけれども…