読者です 読者をやめる 読者になる 読者になる

今更遅れてDataBinding事始め(5.7)

android data_binding

いままでのまとめ

動作環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • AS 2.3 RC1

遣りたかったこと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の値が使えるか?

  • 上記の調べた結果のつぶやきと同じようにビルドエラーはでませんでした
    • レイアウトプレビューでは残念ながら表示はされません。。。
    • ToolBarの app:title とかは layoutPreivew が頑張って表示しているのかな?
    • 基本 Android Boostrap とかサードパーティのはプレビュー全滅ですし。

まあ其のための「InstantRun」ありきの環境なんでしょうけどね

String[] のbind ができるか?

  • String[] は layoutPreview上は真っ赤
 <data>
        <variable name="array" type="String[]"/>
    </data>

List のbindがどうなっているか?

  <data>
        <variable name="list" type="java.util.List>"/>
    </data>
    <data>
        <variable name="list" type="java.util.List&lt;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&lt;String&gt;"/>
    <variable name="sparse" type="SparseArray&lt;String&gt;"/>
    <variable name="map" type="Map&lt;String, String&gt;"/>
    <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]}" /> //★
  • まあ原理的には
    • data-binding記述コードはjavaコードとして分離
    • 除去されたlayout.xmlが最終的なレイアウトファイルになる

だから除去された方の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

遣りたかったこと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 &amp;&amp; bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
'&' --> '&amp';
'<' --> '&lt';
'>' --> '&gt'; //◎

の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度調べた事を「あれどこだっけ?」と調べないようにするための備忘録

*7:まあ公的なSNSで他者批判してはいけない というお話だとは思いますが

*8:マイナンバーとかもそこら辺の人の収入を税務署が補足するためにやってると思っている