カテゴリー: プログラミング

『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
昔よりかは楽になっているんだろうけれども…

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

ナビゲーション

画面間を移動する

2. コレクションの詳細

セットの詳細

All of the code above:ってコードじゃなくて"以上のコード全体を次に示します。"みたいな感じの通常文なんじゃないかな?

4. ラムダ式と高階関数の詳細

高階関数

に使用しますしかし 句点抜け。


アクティビティとインテント

5. 明示的インテントを設定する

デスティネーション アクティビティの
わかりにくいな…なんて言えばいいのかな?
呼び出し先アクティビティ? 起動する宛先アクティビティ?

後で取得される名前が指定された
これも若干わかりにくいな
宛先アクティビティで取得する際に使用される名前が指定された…だと冗長か
後で取得される名前(この例ではletter)が指定された
数値や文字列などのデータ(この例ではholder.button.text.toString())も長いか…
intent.putExtra(識別名,データ)とかにするか…

6. DetailActivity を設定する

詳細アクティビティ
DetailActivityを訳しちゃってる感じ?

コンパニオンオブジェクトってなんか不思議な存在のような…
クラス変数(定数?)とどう違うのか…
コンパニオンオブジェクトを何処に含めるべきかとか考えちゃうと昔ながらの定数記述用のクラスを用意にしちゃったりしても大差ないような気もするけど、importの有無が出てくるのかな?

companion object vs. top-level

うーん、まあ今の俺氏のレベルでは深く気にすることはないようだな(ノ∀`)
つーか多分この先も俺氏のレベルだとそんなに気にすることはなさそうw


9. メニューボタンを実装する

線形レイアウト マネージャー
リニアレイアウトマネージャーの方がまだわかりやすいかな。

否定します
切り替えますとかでええんでないのかな?

注: onCreate() メソッドをオーバーライドする場合、アクティビティの作成を完了するにはスーパークラスの実装を呼び出す必要があります。そのため、このメソッド内ですぐに super.onCreate() を呼び出します。他のライフサイクル コールバック メソッドについても同じことが言えます。

へぇ、そういうことだったんかい(・∀・) 

コードではBundleはnull許容になってる?

注: アクティビティが再作成されている場合、onRestoreInstanceState() コールバックは、onStart() の後にバンドルとともに呼び出されます。ほとんどの場合、onCreate() でアクティビティの状態を復元します。ただし、onRestoreInstanceState() は onStart() の後に呼び出されるため、onCreate() を呼び出した後で状態を復元する必要がある場合は、onRestoreInstanceState() を使用できます。

ふーむ。

おかしいな、画面回転後、デザートの絵は保持されるのに、デザート数と金額が0になる。
クリックすると正しい(?)累積数、累積金額になるんだけども。
描画の更新とかしないといけないのかな…
なんかやり方間違えたか?

わかったw
"binding 変数の設定の後に追加します。"ってあったから一番最後に追加しちゃったけど、
"// Set the TextViews to the right values"の前に貼らないと
バインディングされてるTextViewに値を代入しないわけだな(ノ∀`)


フラグメントとナビゲーション コンポーネント

3. フラグメントとフラグメント ライフサイクル

フラグメント ライフサイクル

"fragments can be initialized and removed from memory"
フラグメントは初期化してメモリから削除できます。
これは違うよねw
初期化及び削除することができます。の方が妥当だよね。

"Also, just like activities, fragments have a lifecycle with several states,"
また、アクティビティと同様に、フラグメントには複数の状態を持つライフサイクルがあり
"複数の"だと同時に状態を複数持つという意味にも取れそうで微妙だな。
"数種の"がいいか…うーむ…
Alsoだからアクティビティと同様に、フラグメントにも数種の状態を持つライフサイクルがありかな?


6. DetailActivity を WordListFragment に変換する

onClickListener() の LetterAdapter LetterAdapterのonClickListener()?

LetterListFragmentのonCreateViewでval view = binding.rootreturn binding.root

なんでbuild.gradleってプロジェクト用とモジュール用に分かれてるんだろうな(´・ω・`)
つーか分かれてるなら名前を変える方が良さそうだけども…

或いはエディタ上では単一のファイルのように見せかけるとか…
説明文だとアプリレベルってあるけどIDE上だと"モジュール:Words.app"と表示されていてわかりにくいし。

つーかこの辺のgradleファイルの編集についてもIDEが良きに計らってくれないもんだろうか。

可能性のあるデスティネーション possible destinationsって上で言っている、
移動できる「デスティネーション」a possible "destination" that can be navigated to.の省略なんだろうな。 どっちもあれだな…"移動可能な"辺りかな?

layout_height 属性と layout_width 属性の下に
layout_height 属性との部分は不要ではなかろうか?


8. ナビゲーション グラフの使用

ナビゲーション グラフをセットアップする

なんか操作を間違えたのか、ナビゲーショングラフには表示されていない。
これは自分で追加していかないといけないのか?
だとすると画像が一つ飛んでるのではなかろうか…
画面左上という表現も微妙だな。デザインペイン(?)の左上とか言わないと一瞬悩むだろう…

setupActionBarWithNavController(navController)ってないな…(´・ω・`)
setupActionBarWithNavController(this,navController)の方にしてみたが…

フラグメントとナビゲーション絡みはきちんと解説ページを読まないと把握できそうにないな(ノ∀`)


ViewModel にデータを保存する

2. スターター アプリの概要

ゲームの概要

ぐぐってみたがアーキテクチャという言葉の定義がいまいちわかりにくい(´・ω・`)
何となくわかったような気がするが、なんかコンテキストによって意味が若干変わりそうな感じがして曖昧モコモコである…

4. ViewModel を追加する

viewModelsへのプロパティ移譲も若干わかりにくい…
コード上の変数名viewModelだと紛らわしいからgameViewModelとかにしといてくれたら良かったのにな。

6. ViewModel のライフサイクル

4.onCreateView() 内の GameFragment
ここも逆かな?

7. ViewModel を設定する

次の単語を取得する

currentWord.

currentWord = allWordsList.random()
val tempWord = currentWord.toCharArray()
tempWord.shuffle()

while (tempWord.toString().equals(currentWord, false)) {
    tempWord.shuffle()
}

ってコード、本当に動く(´・ω・`)?

tempWord.toString()じゃなくて、String(tempWord)とかtempWord.joinToString("")じゃないとうちでは動かない。

issuesには53と58と72で上がってるっぽいねぇ


ヘルパー メソッドを追加する

nextWord().

8. ダイアログ

アラート ダイアログの構造

⑤の説明は?

後置ラムダ構文ってちょっと勘違いしそうだな(´・ω・`)
引数関数とは思い難い。波括弧後の"."が少し受け入れがたいw

private fun getNextScrambledWord()って不要じゃないか? ← 一番最後で消してた

9. Submit ボタンの OnClickListener を実装する

スクランブルされた単語を表示する

onSubmitWord() ない

スターター コード内のコード スニペット

GameFragment,

ViewModelでLiveDataを使用する

LiveData.

4. 現在のスクランブルされた単語に LiveData を追加する

LiveData,

currentScrambledWord LiveData のオブザーバー
を入れるか、LiveDataが不要?

6. オブザーバーをスコアと単語数に接続する

ステップ 2: オブザーバーをスコアと単語数に接続する

onViewCreated()メソッドの最後にあるGameFragmentで
currentWordCount LiveData  ← この2つは何を指摘しているのか思い出せない(ノ∀`)

LiveDataオブザーバーもバインディング式も便利でええのぅ(・∀・)

TalkBackはまた飛ばす。

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

Layouts

Kotlinのクラスと継承

2. クラス階層とは

一応、"豆類"のところのリンクがhttps://en.wikipedia.org/wiki/Legumeだから分かるけど
Legume(マメ科植物)って注釈を入れてくれないとAnimalクラスを例にしたパターンよりも分かりづらいなw

Lentilレンズ豆Chickpeaひよこ豆もわかんねw 世界共通でわかりやすい例を上げるべきだなw

3. 基本クラスを作成する

Dwelling 住居

5. 階層内のクラスを変更する

床面積を計算する

open class RoundHut(
   val residents: Int,
   val radius: Double) : Dwelling(residents) {

突然 residentsにvalをつけてるが何か意味あんのかな? ←※ これ、何の話をしてるのか自分で思考を遡れない(ノ∀`)


Android用のXMLレイアウトを作成する

3. XMLを読んで理解する

xmlnsはXML名前空間を表し、各行はスキーマ(これらの単語に関連する属性の語彙)を定義しています。たとえば、android:名前空間は、Android システムによって定義されている属性を示します。レイアウトXMLのすべての属性が、それらの名前空間のいずれかで始まります。

何言ってるかよくわからない(´・ω・`)
xmlnsってなんだっけ…

xml名前空間name spaceか。
ああ、後に続く単語が所属する属性ということか。
よりわかりやすく言えば、あるプログラム内に同じ名前を持つ要素が複数存在した場合に発生する名前衝突を避ける為の一意的接頭辞としてのURIを名前空間として指定してるって感じか。

xmlnsで指定する名前空間名、android,app,toolsは通例的やコーディングルール的なものでシステム的に指定されているわけではないのかな?
#32 AndroidのXMLのxmlnsとは?
URL と URI の違い
なぜこの行xmlns:Android = "http://schemas.Android.com/apk/res/Android"がレイアウトxmlファイルの最初でなければならないのですか?

厳密に言うと違うけれども、Javaで行っているimportを最上位のコンテナで宣言してるみたいなもんだな。

android属性の値は監視されているのか、変更すると

In Gradle projects, always use http://schemas.android.com/apk/res-auto for custom attributes

Unexpected namespace URI bound to the "android" prefix, was http://schemas.android.com/apk/res/and, expected http://schemas.android.com/apk/res/android

みたいなエラーが出る。

app属性のhttp://schemas.android.com/apk/res-autoを変更するとエラーにはならないが、app属性で指定してるものは動かないのでconstraint等が機能せずに、期待した表示にはならないのか。真っ白しろすけやで(・∀・)

tools属性は

Android Studio では tools 名前空間でさまざまな XML 属性がサポートされており、これを使用して設計時の機能(フラグメントに表示するレイアウトの選択など)やコンパイル時の動作(XML リソースに適用する圧縮モードの選択など)を有効にできます。これらの XML 属性はアプリのビルド時にビルドツールによって削除されるため、APK のサイズと実行時の動作には影響しません。

ということでまさにツール的な感じ…

この辺はAndroid StudioというかGradleの方で決められてるURIってことなのかな?
変更できたりするんだろうな、そうでなかったらデフォルト値として書かせる必要はないもんな。でもなんでマニフェストファイルのルートかなんかでその宣言をしたら、下位と言えるそのアプリ内のレイアウトファイル等で宣言せずに使えるようにしてないんだろうか? レイアウトファイルの独立性というか他アプリへの流用の為?

なんでConstraintLayoutの時に"android:layout_width"に
"parent"を指定したら、内部で自動で0dp、
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
にするみたいにしなかったんだろう?


チップを計算する

4. チップを計算する

チップを計算して、その端数を切り上げる

"For a `Switch` element, you can check the `isChecked` attribute to see if the switch is "on"."
の部分がコードみたいに表示されてるのはなぜなんだぜ(´・ω・`)?

ceil()

8. 概要

Null は「値なし」を意味します。
null の値を処理できないコードもあるため、使用するときは注意してください。
大文字と小文字の違いはなんだっけ(´・ω・`)?
ただの記述ミス?


アプリアイコンを変更する

1. 準備

ランチャーとは、Android デバイスでホームボタンを押してアプリの表示と整理を行う場合や、ウィジェットとショートカットを追加する場合などのエクスペリエンスのことです。

何言ってっるっか、わがんね(´・ω・`)

6. アプリアイコンを変更する

"3.Android Studio の Image Asset Studio ツールが開きます。"の後の
4.5.6.のインテントというかデプスが間違ってて、数字がおかしくなってる?

ベクター型ドローアブル ファイルを-v26ディレクトリに移動する

"Source set: main(デフォルト値をそのまま残します)"
なんか"Source set"の欄がなかった。選択が違うと表示される?

"4.ic_launcher_background.xml ファイルを左クリックして、[drawable-v24] フォルダから [drawable-anydpi-v26] フォルダにドラッグします。"
作業をミスったのか、[drawable-v24]じゃなくて[drawable]フォルダ内におったわ


より洗練されたユーザー エクスペリエンスを作成する

3. マテリアル コンポーネント

テキスト フィールド

まだ EditText を削除していないため、次の属性を EditText から切り取って貼り付け、TextInputLayout に配置します: 制約、リソース ID(cost_of_service)、レイアウトの幅(160dp)、レイアウトの高さ(wrap_content)、チップのテキスト(@string/cost_of_service)。

制約って言う書き方だと見落とすな。長いから省略したんだろうけれども。
つーか意味を掴みづらいと思う。"layout_constraint~"とか各constraintとか制約(constraint)と表記した方がいいな。

5 TextInputEditText.cost_of_service_edit_text.の"."が余計。

スイッチのところでも"."が余計

com.google.android.material.switchmaterial.SwitchMaterial.

5. スタイルとテーマ

android:minHeight,android:gravity,および android:textAppearance.に","と"."が余計。

スタイルをテーマに追加する

View.に"."が余計。

daytimeとnightモード用のxml内の構成要素を意図的に変更していない場合、themes.xmlに追加したら、nightモード用のxmlがある場合は自動的にnightの方にも追加されてもいいような気がしないでもない。daytime用xmlとそのnight差分と言う形でnight用xmlを自動生成するような。

6. ユーザーエクスペリエンスの向上

Enter キーでキーボードを非表示にする

下記のヘルパーメソッドをコピーしてMainActivity クラスに貼り付けます。MainActivity クラスの右中かっこの直前に挿入できます。

めっちゃわかりにくいw

下記のヘルパーメソッドをコピーしてMainActivityクラスの末尾に貼り付けます。

くらいでいいんじゃないかな。

binding.costOfServiceEditText.
binding.calculateButton.setOnClickListener { calculateTip() }.
view, keyCode, _ -> handleKeyEvent(view, keyCode).
TalkBackは飛ばした(ノ∀`)


Kotlinでリストを使用する

4. リストをループする

while ループ

注のところの"除算"のところがスラッシュじゃなくてバックスラッシュになってる?

5. すべてをまとめる

"by passing in "Noodles" as the name and the price of 10."

name と price を 10 として "Noodles" を渡すことで

なんか翻訳がおかしいな…

nameとしての"Noodles"とpriceの10を渡すことで

辺りかな?

toString() メソッドをオーバーライドする

When you print an object instance to the output
ここは出力じゃなくて逆にprintのままの方が意味が通じやすいんじゃなかろうか。或いは画面出力とか。今までもあったけど、単純にprintを"出力"に訳しちゃうと出力が持つ多義が理解の妨げを誘発するよね(´・ω・`)

なんでItemクラスでtoStringをオーバーライドしないんやろ。

みんな大好き可変長引数はvarargを使うのか。 ← お前が好きなだけや(・∀・)


RecyclerView を使用してスクロール可能なリストを表示する

3.データのリストのセットアップ

Affirmation データクラスを作成する

stringResourceIdは紛らわしくないかな?
文字列リソースのIdというのは間違いないが、この命名はstring型のリソースIdと誤解されそう。
AffirmationResourceIdでいいんじゃ?

4. アプリに RecyclerView を追加する

RecyclerView のアダプタを実装する

RecyclerView.

ViewHolder を作成する

ItemAdapter の右波かっこの前で

あれ? 今まで"中かっこ"って表記してたのに、なぜここで急に"波かっこ"にw

RecyclerViewViewHolder のサブクラスにして
"."抜け

この辺のAdapterとViewHolderの話からよくわからなくなってくる(ノ∀`)
これはある程度使い方に慣れるか、ソースを見ないとピンと来ないかもw


カードを使用して画像の一覧を表示する

2.リストアイテムに画像を追加する

ImageViewをリストアイテムのレイアウトに追加する

LinearLayout,
TextView,
centerCrop.

ItemAdapter を更新して画像を設定する

imageView.

3.UIの改良

カードを使用する

LinearLayout.

リソース アノテーションなんてものがあるんだねぇ…

あれ…?
今までクイズはずっと英語だったのに、ここから日本語に?
単純に今までも日本語に出来たのかな?

1問目 mutableでもミュータブルでもない…だと……( ;・´ω・`)ゴクリッ
7問目もnum in numbersじゃないのか…

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

kotlinの学習ついでにAndroidについての復習をしようとWelcome to Android Basics in Kotlinをやった。全部で4単元あった。中々のボリュームであった。

我が家のネットワーク環境の遅さ等も足を引っ張り、読み進むのに時間がかかった。最後までやったけど、きちんと理解し記憶しているかと言えば微妙(ノ∀`)
今後の学習をする際に手や足を掛けていけそうな単語等の知識と言語経験を得た感じくらいかな。

以下はその際のメモ書き、主に自動翻訳に対するケチやハマったことの単純な記録を少し修正したものなので、余り有用な内容ではない。

いつものことだが、時間が多少経ってしまっているが為に自分でも何の話をしているのかはよくわからない部分がある(ノ∀`)


全般的に思ったこと。

  • ナビゲーター(喋る人)が複数居て、なんか観てて面倒くさい。なぜ複数の人の顔や声という余計な情報を垂れ流すのだろうか。後の単元では一人だけの動画になったりしたが、正直、学習系動画は声とコードや画面映像だけで良いと思う(´・ω・`) ← ノリについていけないだけとも言うw
  • 括弧の表記がぶれているのはいただけない。"{}"を中括弧と呼んだり波括弧と呼んだり。個人的には波括弧で統一して欲しかった。"[]"を角括弧として表記しているので。あと文中では"かっこ"だけど"括弧"または"カッコ"の方がいいかなぁ?
  • "タスク"は"処理"と表現した方が良いような。或いは"タスク"とは何かという説明を先にした方が良いような。一応初心者向けコースなので。

Introduction to Kotlin

コードラボが中々始まらない。
考えてみれば最初のログインの時も無茶苦茶時間がかかったような。うちの回線の問題なんだろうか? コードラボ自体は日本語化されてる模様。
← 最後のテストが日本語の時と英語の時があった。言語設定が上手く機能していなかっただけだろうか?

Kotlin で初めてのプログラムを作成する

3.プログラムを変更する

関数とは、特定のタスクを実行するプログラムのセクションのことです。

関数とは、特定の処理を実行するプログラムの部品(一部分)のことです。

の方が良いかなぁ…

mainは、この関数の名前です。関数には名前があり、それによってお互いを区別します。この関数は、プログラムを実行すると最初に呼び出される、つまりメインの関数であるため、main と呼ばれます。すべてのKotlinプログラムには、mainという名前の関数が必要です。

関数は名前を持ち、それによって区別されます。この関数の名前はmainであることを意味しています。mainの名前を持つ関数はKotlinでプログラムの実行時に最初に呼び出される特別な関数です。必ずプログラム内に存在しなければいけません。

※後々の匿名関数の説明を踏まえると基本的に関数は名前を持ち、または関数には名前をつけて他の関数と区別して使用することができます。という表現の方が妥当か?

println で、テキスト行を出力するようシステムに指示します。

printlnという命令文でテキストを画面に出力するようにシステムに指示します。 このprintlnという命令文(の中身)はKotlinで提供されている定義済の関数です。

あと、ここで"println 命令"という表現というか翻訳をしてしまっているな…


4.プログラムを拡張する

いきなり println() functionという表現が出てくるので、やはり上のような説明の追加かfunction関数と表記というか翻訳すべきでは?

ただは要らないか、前回のサンプルでは一行の命令行しかありませんでしたが、かなぁ…

フィードバック機能というよりもエラー通知機能とかの方がわかりやすいかなぁ?

ミスコーディングミスとかの表現の方がいいかな。

Error という単語を含むメッセージが表示されます。
含んでないで(ノ∀`)


6.

すべてのKotlinプログラムにでもいいんだけどにはの方が良いかな…どうかな…これは個人の好き好きかw

テキスト行を出力するには、println() 関数を使用します。
複数のテキスト行を出力するには、println() 命令を繰り返します。
関数と命令と言う異なる単語を使う意味はなんだろうか? ← 原文がfunctionとinstructionだった。repeatを使った表現だからかな?
やはり関数呼び出し=システムへの指示・命令であることを先に明確に説明すべきなのではないかな。あとは命令文=ステートメントとか。

まあ何にせよ、初心者向けの学習教材では単語とか表現は出来るだけ統一して、本筋の知識の習得を妨げない方が良さそうだけどねぇ… 

対象が初心者ではなくて初級者なら、その知識を広げるための覗き穴を設けることは賛成だけれども。


Kotlin で誕生日メッセージを作成する

2. Kotlin で誕生日メッセージを作成する

スターター コードを設定する

2. fun main() 関数内のテキスト "Hello, world!" を "Happy Birthday, Rover!" に置き換えます。

2.main関数内にあるprintln命令の引数である"Hello, world!"を"Happy Birthday, Rover!"に置き換えます。

"引数"の説明って既に出てたかどうか忘れた(ノ∀`)

3.その下の中かっこ内に、出力用の "You are already 5!" と "5 is the very best age to celebrate!". の 2 行を追加します。

"3. そのprintln命令の下に、新たに"You are already 5!"と"5 is the very best age to celebrate!"の 2 行を出力するためのprintln命令を追加します。"

バースデーケーキを追加する

画像が必要ですでもいいけど、イメージなどが一緒にあるといいでしょうくらいでいいんじゃね( ゜σ・゚)ホジホジ?

キーボードと println() で文字と記号を何行か出力すると、誕生日メッセージにケーキを追加できます。キーボードとの部分は要るかね?

ステートメントという言葉の説明はしてたっけ?
突然出てくるような。

以下の print ステートメントの行を追加します。とあるが、printとprintlnは違う物だと思う…

もしかすると以下の出力ステートメントの行を追加します。が正しい翻訳?

「ローバーの年齢を変数に格納する」辺りの説明で色々と文章にケチをつけたくなったが、もう面倒くさいのでそれはやめた。日本語としておかしいというか説明文としては言葉足らずでわかりにくい。原文自体の表現が微妙だったり、翻訳が微妙だったりする感じを受ける。

※以降、徐々に気力を失って細かい指摘が少なくなっていく模様w


4. 枠線付きの誕生日バナーを出力する

枠線を出力する関数を作成する

funキーワードは特定のコードを関数としてマークします。

funキーワードは特定のコードを関数として分離する為に使用します。

funキーワードの後は、関数名、関数への任意入力のためのかっこ(引数)、中かっこの順に記述します。

関数名、丸括弧、波括弧の順に記述します。
丸括弧内には処理で必要となる情報(=引数)を記述し、波括弧内にはその関数内で行う処理を記述します。

テキストを出力するためのコードは、常にこの中かっこ内に記述します。

テキストを出力する為のコードは、処理に当たるので、この波括弧に記述します。

関数を変更して2つの引数を指定する

なんか記述にミスがあるのか文章がおかしい。
英語と日本語が混在している?


基本レイアウト

Androidアプリに画像を追加する

4.適切なコーディング慣習の採用

警告アイコンをクリックしてもFix用のWindowが表示されない…
なんか設定を変えてしまったかな?
問題ウィンドウからクィックフィックスの表示で"文字列リソースの抽出"をクリックしたが、これまた反応がない。values/string.xmlにも追加されていない…
なんじゃらほい(´・ω・`)
うちのAndroid Studioの設定がおかしいんかな?

The type of ViewGroup that helps you arrange the views inside of it in a flexible way is called a

が分からなかった。Layoutとか答えちゃった(ノ∀`)
ごっぐる翻訳を使ったのに問題文を理解できてないんだなw
RelativeLayoutとかなのか(´・ω・`)?
← 何の話かと思ったら空欄記述問題の話か…

Kotlinのクラスとオブジェクトインスタンス

カプセル化の説明ってこれでいいんだろうか?
厳密には微妙に違うような…

キャメルケースにも先頭も大文字にするアッパーキャメルケース(UCC)ってあるんだな…ってこれはパスカルケースって呼ばれる方が普通なのかと思ってたわ(´・ω・`)

一般的(?)な先頭小文字の場合はローワーキャメルケース(LCC)って言うのか…

コンストラクタ引数ってそのままプロパティになるんかΣ(゚∀゚;)ベンリ


インタラクティブなDice Rollerアプリを作成する

4. アクティビティの概要

onCreate() メソッドの残りの部分では、インポートのコードを使用し、setContentView() で開始レイアウトを設定することにより、MainActivity を設定しています。

何言ってるかわからんw

6. サイコロを振るためのロジックを追加する

rollDice() メソッドを作成する

クリック リスナーでテキストを「6」に設定しているコードを、rollDice()の呼び出しに置き換えます。

何の話をしてるんだ…( ;・´ω・`)ゴクリッ?
Toastの部分の話をしてるんだろうけれど…
他のプラットフォーム用のチュートリアルを流用したのか、以前はテキストボックスに"6"を代入していたのかな。


Kotlinで条件付き動作を追加する

2. コード内での意思決定

変数 num を作成し、5. に設定します。
「num は 4, より大きい(>)」

翻訳が原文の"."や","を含んでしまってる?

考えてみると"The variable is greater than ~"ってなんか変だな…
valueじゃないのか?

numは前のコードを流用して

val num = (1..6).random()

とかの方が良いな。

3. Lucky Dice Roll ゲームを作成する

スターター コードを設定する

diceRollrollResultに直してないなw

6. 適切なコーディング慣習を採用する

実用的な起動体験を構築する

ユーザーに奇妙が印象を与えます。
奇妙な?

A class is for defining categories of "things", while instances are for defining their properties.
なんか違うと言えば違うような気がする。間違いだった(ノ∀`)

Use // to turn the rest of a function into a comment.
これ、関数の残りの全行に対して//を施せばそれはそれで正解のような?


長い(ヽ'ω`)