今更遅れてDataBinding事始め(5.7)
- いままでのまとめ
- 動作環境
- 遣りたかったこと1(String[] のbind )
- 結果
- 遣りたかったこと2(bindしているレイアウト内のカスタムView内でのbind)
- 遣りたかったこと3( layou.xml 内での && 条件)
- 最近凄くびっくりしたこと
いままでのまとめ
- 今更遅れてDataBinding事始め(1)[環境構築] - exception think
- 今更遅れてDataBinding事始め(2) - exception think
- 今更遅れてDataBinding事始め(3)[include] - exception think
- 今更遅れてDataBinding事始め(3.5) - exception think
- 今更遅れてDataBinding事始め(3.7) - exception think
- 今更遅れてDataBinding事始め(4)[双方向] - exception think
- 今更遅れてDataBinding事始め(4)[双方向] - exception think
- 今更遅れてDataBinding事始め(5)[コピペ用] - exception think
- 今更遅れてDataBinding事始め(5.5)[コピペ用] - exception think
動作環境
遣りたかったこと1(String[]
のbind )
- tools:text で data-bindingの値が使えるか?
String[]
のbind ができるか?- List のbindがどうなっているか?
- tools:text で string-arrayの配列要素のプレビューとかできるか?
なんで String[]
やりたかったの?
- Modelクラス作るのが面倒
- Marker => infoWindow でデータ連携させる時に一番簡単なのか下記のString変数代入
- setTitle()
- setSnippet()
上記の関数に表示データを「,」セパレータで区切ったCSVモドキで渡すのが一番ラク*1
ひな祭り,1,なにそれ美味しいの?
みたいなイメージで
結果
tools:text で data-bindingの値が使えるか?
tools:text=“@{viewModel.title}”と書いてあって「ハハッtoolsに書いてやがる」と思ってビルドしたら何故か動いてて震えてる
— イーノ (@ytRino) 2017年3月2日
- 上記の調べた結果のつぶやきと同じようにビルドエラーはでませんでした
Android Bootstrap 試してみたけど
— snowpool (@snowpoollikely) 2017年3月1日
FontAwesomeアイコンは実機やエミュレータだと表示されるのに
xml ファイルのプレビュー画面だとアイコンが表示されないという
謎な状態です
まあ其のための「InstantRun」ありきの環境なんでしょうけどね
String[]
のbind ができるか?
<data> <variable name="array" type="String[]"/> </data>
List のbindがどうなっているか?
List はGenerics形式で書かないとLintエラーにされるなう・・
NG
<data> <variable name="list" type="java.util.List>"/> </data>
<data> <variable name="list" type="java.util.List<String>"/> </data>
- NG(G様公式で書かれているパターンorz)
<data> <import type="android.util.SparseArray"/> <import type="java.util.Map"/> //△===記述いらない=== <import type="java.util.List"/> //△===記述いらない=== <variable name="list" type="List<String>"/> <variable name="sparse" type="SparseArray<String>"/> <variable name="map" type="Map<String, String>"/> <variable name="index" type="int"/> <variable name="key" type="String"/> </data>
- 参照の仕方は公式のままでOK
android:text="@{list[index]}" android:text="@{sparse[index]}" android:text="@{map[key]}" android:text="@{map[`mouse`]}"
AS2.3 RC1 現在は
- javaのパッケージは標準で通っているのでimportはいらない
- androidパッケージは何故か通っていないので自前でimportが必要なのは変わらず。。
- その代わりコード補完が効くようになったが、この補完verup時に頻繁に動いたり動かなくなったりするので次のverupでどうなることか。。
ちなみに公式記述だと
<data> <import type="android.view.View" alias="v" /> </data> <TextView android:visibility="@{TextUtils.isEmpty(array[0]) ? v.GONE:v.VISIBLE}" android:text="@{@array[0]}" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="さんたさん" />
という別名記述の記載方法もあるはずなんですが
- layoutEditor =>エラーにならない
- コンパイル時 =>文法エラー
公式の説明文章がメンテされてないので、正直何を正解としていいのか分からない。
よくOSSでrelease noteしかアナウンスされないみたいなのが有るんですけど
五月雨に変更情報出されて「スゲーだろ」言われてもアップデートする方としてはすごく困るんだよな
と思ってしまうのは、駄目なんでしょうかね〜(汗 *3
tools:text で string-arrayの配列要素のプレビューとかできるか?
- app/res/value/arrary.xml
<string name="mouse">Mouse</string> <string name="cow">Cow</string> <string name="tiger">Tiger</string> <string-array name="animals"> <item>@string/mouse</item> <item>@string/cow</item> <item>@string/tiger</item> </string-array>
と定義されている状態で
- OKパターン(従来通り)
<TextView android:visibility="@{TextUtils.isEmpty(array[1]) ? View.GONE:View.VISIBLE}" android:text="@{@stringArray/animals[Integer.valueOf(array[1])]}" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="@string/mouse" /> //★
- NGパターン(use data-binding)
<TextView android:visibility="@{TextUtils.isEmpty(array[1]) ? View.GONE:View.VISIBLE}" android:text="@{@stringArray/animals[Integer.valueOf(array[1])]}" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="@{@stringArray/animals[0]}" /> //★
だから除去された方のlayout.xmlでプレビュー作られていたら、どうにもならないよね。
- 理想形
<TextView 〜略〜 tools:text="@stringArray/animals[0]" /> //★
or
<TextView 〜略〜 tools:text="@array/animals[0]" /> //★
- data-biningでない場合は「通常のリファレンス」の形式でしか認識できない
- data-bindingのスコープで、黒魔術的にあくまで式拡張がされているのみで既存拡張はない
android:text / tools:text の記述の捕捉
下記は データ バインディング ライブラリ | Android Developers から抜粋
型 | 通常のリファレンス | 式のリファレンス |
---|---|---|
String | @array | @stringArray |
int | @array | @intArray |
TypedArray | @array | @typedArray |
Animator | @animator | @animator |
StateListAnimator | @animator | @stateListAnimator |
color | int @color | @color |
ColorStateList | @color | @colorStateList |
- ここで重要なのは
- data-bindingでの参照は「式のリファレンス」で参照する
- @array がかけそうな気がするけど not found tag とエラーにされる
という話。公式サイトの説明がよくわからんなー。わかっている人が書いている説明なので仕方ないのかもしれないけど。
正直 realm 3.0 のrelase-noteも今一説明が冗長で分かりづらかったし・・*4
realm 3.0 の変更って、
— close_yutori (@kimukou2628) 2017年3月2日
distinctとchangeListerとforループ使ってる人が影響うけるかんじで
foreachで参照してたり、あんまり難しい事してない自分には関係なかった。
遣りたかったこと2(bindしているレイアウト内のカスタムView内でのbind)
- 下記の状態のときのbind
layoutA.xml <A> | layoutB.xml <B> | CustomParts | layouttC.xml <C>
みたいなlayoutで、layoutA.xml がdata-bindingをした時
と言うかたちでこの3つのレイアウトはdata-bindingAスコープにマッピングされているわけです
- <B>にアクセス
- idを振って layoutA.xml 経由でinclude文としてアクセス
がアクセス方法になるわけですが、<C>に関しては通常アクセス方法がありません。
- <C>で独立してdata-binding
- BindingUitls.bind(view) => NG
- BindingUitls.findBinding(view) => OK
で 普通ココらへんってAPI Doc探そうとするんですが、本当にググりビリティが悪すぎ。。
メンテされていない使い方ページがtopにくるという。。なんだかね。。
あとは下記のページぐらいか。findBindingで出てくるページは。。
遣りたかったこと3( layou.xml 内での && 条件)
表示項目の条件は、仕様でコロコロ変わるので
- layoutでかけるなら其の方が楽
- ただ1個のレイアウトでエラーになると R生成エラー & APT関連の変換全エラーはたるい
- 編集レイアウトだけAPT変換とか無理なん? 毎回全変換してエラーにしてるけどさ・・
NG
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId && bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId && bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
'&' --> '&'; '<' --> '<'; '>' --> '>'; //◎
のhtml encodeが必要という話。◎に関しては変換しなくても認識可能
string.xml に関してもそうだけど、中途半端にencodeが必要だから正直萎えるんだよな。。
最近凄くびっくりしたこと
Pleiades を開発されている 著名な cypher256 先生が当ブログを参照されていたようで、コメントを頂き、すごくビビりました。
一時期下記のリンクが大量RTされていたので目にした方は多いハズ
Pleiadesの方を軽量化する形でわざわざ改修して頂けたそうで、お手を煩わせてしまいご迷惑をおかけしました。*5
あとで再検証させていただきます。
大変ありがとうございます。先生のサイトは下記
でも 当ブログ、自分の覚書ブログなので twitterとかでも更新通知とかしてないんですよね。*6
どうやってお知りになられたんでしょう??
Twitterあたりのエゴサーチあたりで引っかかってしまったのでしょうか、、
でもまあ、Twitterのサービスも成熟期に入っているせいか
- 引用Tw => メンションに通知が来る
- 相手がブロックしていても、自分がブロックしていても相手にメンション通知が行くらしい
- スパムっぽいつぶやきは自動ミュート(機械学習とかのアルゴリズム使う?)
- スパムっぽいアイコンのアカウントは自動ミュート(機械学習とかのアルゴリズム使う?)
- 公式ソフトは「ニュースタブ」とか表示リスト内に「広告」CardViewとか色々収益モデルに苦戦中?
とか聞いているだけで面倒くさそうな改修とか頑張っていらっしゃるみたいですね。*7
それでいて基本赤字で収益上がらなくてFebricをG様に切売するみたいな状況だから難しいものです
- GoogleのクラッシュレポートよりFebricのクラッシュレポートのほうが便利
- AnswerもGAよりすごく軽い(ユーザー数少ないから?)
とか現状のほうが利点あるんですけどね・・・
でもまあ 開発者がやりがいを感じながら収益も上がる 業務モデルっていうのが難しいんでしょうね
最近また、周りで株始めてる人が増えてきているからな・・*8
*1:そういえば巷で 休日CSV の話がRTされまくってましたね・・
*2:今後Lintでエラーとかにされなければ使えるかと
*3:まあコミュニティに開発参加していない利用ユーザーベースの技術者のことをコーダーと蔑視する傾向が日本には有りますし・・
*4:結局githubのreadme.mdを翻訳かけて読んで理解した
*5:正直な所、チープな環境で開発しているので、そこまで気にされなくてもとは思いましたです。eclipseベースのときもチープな環境では、Pleiadesを外していましたし・・
*6:大した内容を記載しているわけでもなく、あくまで1度調べた事を「あれどこだっけ?」と調べないようにするための備忘録