Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ankoに はさんで はさまれて 発表者ノート付き

Ankoに はさんで はさまれて 発表者ノート付き

第一回 Kansai.kt 発表資料

Avatar for yamm800

yamm800

July 10, 2016
Tweet

More Decks by yamm800

Other Decks in Technology

Transcript

  1. "OLP w ,PUMJOͷ%4-Ͱ"OESPJEͷ6*Λ૊ΈཱͯΔϥΠϒϥ Ϧ w +FU#SBJOTެࣜ w ·ͩόʔδϣϯ ·ͣAnkoͱ͸ͳΜͧ΍ͱ͍͍·͢ͱ KotlinͷίʔυͰAndroidͷUIΛ૊ΈཱͯΔϥΠϒϥϦͰ͢ɻ

    Kotlin͸ׂͱؾܰʹDSLΛ࡞ΕΔͱ͍͏ݴޠͳͷͰɺͦΕΛੜ͔ͨ͠ϥΠϒϥϦͰ͢Ͷ JetBrains ެࣜͰ ·ͩόʔδϣϯ͸0.9Ͱ͢
  2. "OLPͷϝϦοτ w 9.-Ͱͳ͍͜ͱʹΑΔϝϦοτ w 9.-Λύʔε͠ͳ͍͍ͯ͘ͷͰૣ͍ w pOE7JFX#Z*E͠ͳ͍͍ͯ͘ w ,PUMJOʹΑΔԸܙ w

    ܕ҆શ w /VMM҆શ w ػೳ֦ு͕༰қ w ϥΠϒϥϦʹศརͳؔ਺͕༻ҙ͞Ε͍ͯΔ ͜ΕΛ͔ͭ͏ͱͲ͏͍͏͍͍͜ͱ͕͋Δ͔ͱݴ͍·͢ͱ ·ͣXMLͰͳ͍͜ͱͷϝϦοτͯ͠XMLΛಡΈࠐ·ͳ͍͍ͯ͘ͷͰͦͷ෼ૣ͍͜ͱɺfindViewById͠ͳ͍͍ͯ͘͜ͱͳͲ͕͋Γ·͢ɻ Kotlin Ͱ͋Δ͜ͱͷϝϦοτͱ͠·ͯ͠͸ɹKotlinͷԸܙΛͦͷ··ड͚ͯܕ҆શ, Null҆શͰ ֦ுؔ਺ͳͲ΋ؾܰʹ࢖͑ΔͷͰػೳ֦ு͕༰қͳͱ͜Ζ͕͋Δͱࢥ͍· ͢ɻ ࣮ࡍAnkoϥΠϒϥϦʹ͸৭ʑͳศརͳؔ਺͕༻ҙ͞Ε͍ͯ·͢ɻ
  3. ෆຬ఺ w %BUB#JOEJOHͱҰॹʹ͸࢖͑ͳ͍ w %FMFHBUFE1SPQFSUJFTΛ࢖͑͹ࣅͨΑ͏ͳ͜ͱ ͸Ͱ͖Δ͚ΕͲͪΐͬͱ໘౗ w 1SFWJFXͰ9.-Ͱͷ5PPMTଐੑͷΑ͏ͳ͜ͱ͕Ͱ͖ ͳ͍ w

    $POTUSBJOU-BZPVU͸Ͳ͏ͳΔ ͪΐͬͱؾʹͳΔ఺ͱͯ͠͸Data BindingͱҰॹʹ͸࢖͑ͳ͍ΜͰ͢ΑͶɺσϦήʔγϣϯ࢖͑͹ࣅͨΑ͏ͳ͜ͱ͸Ͱ͖ΔΜͰ͚͢ΕͲ΍ͬͺެࣜͷData Binding΋݁ߏ ศརʹͳ͖͍ͬͯͯΔͷͰ ͦͬͪ࢖͍͍ͨਓ΋͍Δͱࢥ͍·͢ɻ ͋ͱPreviewʹػೳͰ XMLͷToolsଐੑΈ͍ͨͳɺຊ౰͸GONE͚ͩͲPreviewͰ͸VISIBLEʹͳͬͯͯཉ͍͠ͱ͔΋·ͩग़དྷͳ͍ͬΆ͍Ͱ͢Ͷ ͋ͱ࠷ۙग़͖ͯͨͳΜ͔͍͢͝ศརͦ͏ͳ iOSͰ͍͏ͱ͜ΖͷStoryBoardΈ͍ͨͳͷ΋ Ͳ͏ͳΔͷ͔Θ͔Γ·ͤΜͶ ·͋ɺԼೋͭͱ͔͸IDE΋བྷΜͰΔΜͰJet Brains͕Ͳ͏ߟ͍͑ͯΔͷ͔ͱ͍͏͔ɺࠓޙͲ͏͍ͯͭ͘͠΋Γͳͷ͔͕ؾʹͳΓ·͢Ͷɺ Jet Brainsʹৄ͍͠ํͱ͔ɹ͝ଘ஌ͳ͍Ͱ͔͢Ͷ…
  4. override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 
 verticalLayout {
 val

    name = editText()
 button("Say Hello") {
 // ボタンを押したらトーストを表示
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 } "DUJWJUZͷதͰ࡞Δྫ  ·ͣActivityͷதͰ࡞Δͱ͖͸ී௨ʹonCreateͷதͱ͔Ͱ͜͏΍ͬͯ verticalLayout ׅހ buttonͱ͔ͰView͕ͭ͘Ε·͢ɻ ͪͳΈʹverticalLayout͸LinearLayout͕verticalʹͳͬͯΔ΍ͭͰͨͩͷLinearLayoutͰ͢ ͜Ε͸setContentViewͱ͔addViewͱ͔͠ͳͯ͘΋େৎ෉Ͱ͢ɻ
  5. class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState:

    PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent<MyActivity> {
 override fun createView(ui: AnkoContext<MyActivity>) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  ͰɺΫϥεΛ෼͚ͯॻ͖͍ͨͱ͖ʹ͸͜Μͳײ͡ʹͳΓ·͢ɻ
  6. class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState:

    PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent<MyActivity> {
 override fun createView(ui: AnkoContext<MyActivity>) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  JOUFSGBDF"OLP$PNQPOFOU5\ GVODSFBUF7JFX VJ"OLP$POUFYU5 7JFX ^ AnkoComponentͬͯΠϯλʔϑΣʔε͕͋ΔΜͰ͍࣮ͦͭ૷ͨ͠Ϋϥεɺ ͳΜͱ͔UIΫϥεΈ͍ͨͳͷΛ࡞ͬͯ͋͛·͢
  7. class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState:

    PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent<MyActivity> {
 override fun createView(ui: AnkoContext<MyActivity>) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  Ͱ͍ͦͭͷsetContentViewݺΜͰ΍Ε͹͖ͬ͞ͱಉ͡UI͕Ͱ͖·͢ɻ
  8. class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState:

    PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent<MyActivity> {
 override fun createView(ui: AnkoContext<MyActivity>) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  ΫϥεΛ෼͚ͯ΋1SFWJFX͸ಈ͖·͢ ͜ΕΫϥε෼͚ͯΔঢ়ଶͰ΋Preview͸ಈ͖·͢ΜͰɺActivityͷத͕ͪ͝Όͪ͝Ό͢Δͷݏͩͳʔͬͯͷ͸৺഑͠ͳ͍͍͔ͯ͘ͱࢥ͍·͢ɻ
  9. override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {


    return UI {
 verticalLayout {
 val name = editText { }
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }.view
 } 'SBHNFOUͰ࢖͏ྫ  Ͱ࣍ʹFragmentͳΜͰ͕͢͜Ε΋͖ͬ͞ͱ΄΅ಉ͡ͰɺonCreateViewΛͷதͰ͜͏͍͏ײ͡ʹDSLΛॻ͍͍͚ͯ͹͍͍͚ͩͰ͢ɻ
  10. override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {


    return UI {
 verticalLayout {
 val name = editText { }
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }.view
 } 6*\^WJFXͰ͸͞Ή 'SBHNFOUͰ࢖͏ྫ  Ұݸ͚ͩҧ͏ͷ͸UI ׅހ .viewͰ͸͞Ή͜ͱͰ͢Ͷ ͜͏͢Δͱ viewΛฦͯ͘͠Ε·͢ɻ
  11. // 以下の2行を追加 (カスタムビューの中などで良い)
 // ViewManagerの拡張関数
 
 inline fun ViewManager.customView(theme: Int

    = 0) = customView(theme) {}
 inline fun ViewManager.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init) ΧελϜϏϡʔΛ"OLP%4-ͷதͰ࢖͏  ؾʹͳͬͯΔਓ΋͍͔ͨͱࢥ͏ΜͰ͕͢ΧελϜϏϡʔ΋AnkoͷதͰ࢖͑·͢ ViewManagerͬͯ΍͕͍ͭΔΜͰ͚͢ΕͲ͍ͭ͜ͷ֦ுؔ਺Λೋͭ࡞Γ·͢ɻ ͕࣌ؒ͋ͬͨΒ࿩͔͢΋͠Ε·ͤΜ͕ ͪΐͬͱ΍΍͍͜͠ΜͰ͚͢ͲɺΧελϜϏϡʔΛॳظԽ͢Δؔ਺Λ౉͢ͱதͰΧελϜϏϡʔΛ࡞ͬͯɺͦͷϏϡʔΛAnkoͰ࢖ ͑ΔΑ͏ͳ΋ͷʹม׵ͯ͠ฦͯ͘͠Ε·͢
  12. // 以下の2行を追加 (カスタムビューの中などで良い)
 // ViewManagerの拡張関数
 
 inline fun ViewManager.customView(theme: Int

    = 0) = customView(theme) {}
 inline fun ViewManager.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init) // これでカスタムビューをAnkoに はさめる frameLayout {
 customView {
 
 }
 } ΧελϜϏϡʔΛ"OLP%4-ͷதͰ࢖͏  ͜ΕͰΧελϜϏϡʔ΋Ankoʹ͸͞Ί·͢͠
  13. // 以下の2行を追加 (カスタムビューの中などで良い)
 // ViewManagerの拡張関数
 
 inline fun ViewManager.customView(theme: Int

    = 0) = customView(theme) {}
 inline fun ViewManager.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init) // これでカスタムビューをAnkoに はさめる // カスタムビューの中にも Ankoを はさめる frameLayout {
 customView {
 text = textView("Anko CustomView")
 }
 } ΧελϜϏϡʔΛ"OLP%4-ͷதͰ࢖͏  ΧελϜϏϡʔͷதʹ΋Ankoͷॻ͖ํΛڬΊΔΑ͏ʹͳΓ·͢
  14. relativeLayout {
 // 一意のidを生成 ids.xmlに指定しても良い
 var main_activity_text: Int = View.generateViewId()


    
 textView = textView {
 id = main_activity_text
 }
 
 textView {
 text = "Bottom of R.id.main_activity_text"
 lparams {
 bottomOf(main_activity_text)
 }
 }
 } *%Λࢦఆͯ͠3FMBUJWF-BZPVUͰ࢖͏  ͑ʔͬͱɺɹ͋ͱɹͦ͏͔ RelativeLayout ͷதͰଞͷϏϡʔͷԼʹฒ΂͍ͨͱ͖ͱ͔ͬͯIDΛࢦఆ͠ͳ͍ͱ͍͚ͳ͍ΜͰ͚͢Ͳ
  15. relativeLayout {
 // 一意のidを生成 ids.xmlに指定しても良い
 var main_activity_text: Int = View.generateViewId()


    
 textView = textView {
 id = main_activity_text
 }
 
 textView {
 text = "Bottom of R.id.main_activity_text"
 lparams {
 bottomOf(main_activity_text)
 }
 }
 } *%Λࢦఆͯ͠3FMBUJWF-BZPVUͰ࢖͏  View.generateViewIdͬͯͷΛݺΜͰ΍Ε͹ಈతʹID࡞ͬͯ͘Ε·͢ͷͰ
  16. relativeLayout {
 // 一意のidを生成 ids.xmlに指定しても良い
 var main_activity_text: Int = View.generateViewId()


    
 textView = textView {
 id = main_activity_text
 }
 
 textView {
 text = "Bottom of R.id.main_activity_text"
 lparams {
 bottomOf(main_activity_text)
 }
 }
 } *%Λࢦఆͯ͠3FMBUJWF-BZPVUͰ࢖͏  ͦΕΛViewʹηοτͯ͠
  17. relativeLayout {
 // 一意のidを生成 ids.xmlに指定しても良い
 var main_activity_text: Int = View.generateViewId()


    
 textView = textView {
 id = main_activity_text
 }
 
 textView {
 text = "Bottom of R.id.main_activity_text"
 lparams {
 bottomOf(main_activity_text)
 }
 }
 } *%Λࢦఆͯ͠3FMBUJWF-BZPVUͰ࢖͏  ͦͷIDʹରͯ͠bottomOfͱ͔ࢦఆͯ͠΍Ε͹େৎ෉Ͱ͢ɻ ids.xmlʹIDΛએݴ͓͍ͯͯͦ͠ΕΛ࢖͏ͬͯํ๏΋͋ΔΜͰ͕ͦͬͪ͢͸ͪΐͬͱ෼͔ΓͮΒ͍ؾ΋͠·͢Ͷ
  18. // Toast
 toast(R.string.message)
 
 // アラートダイアログ
 alert("Hi, I'm Roy", "Have

    you tried turning it off and on again?") {
 yesButton { toast("Oh…") }
 noButton {}
 }.show()
 
 // Activityの呼び出し
 startActivity<SomeOtherActivity>("id" to 5) ศརͳػೳ  ·͋͋ͱ͸৭ʑศརͳػೳΛ༻ҙͯ͘͠Ε͍ͯΔͷͰτʔετͱ͔μΠΞϩάͱ͔ΞΫςΟϏςΟݺͼग़ͨ͠Γͱ͔खܰʹͰ͖·͢Αɹͬͯͷͱʙ
  19. // 非同期処理
 
 doAsync {
 // 何か重い処理
 
 // Acitivityがfinishしていたら呼ばれない


    activityUiThreadWithContext {
 result.text = "Done"
 }
 } ศརͳػೳ  ͋ͱ͜Ε͸ඇಉظॲཧ΋͏·͍͜ͱ΍ͬͯ͘Ε·͢Αͬͯ΍ͭͰ͢Ͷɻ activityUiThreadWithContextͬͯͷ͸ ͜Ε͕ݺ͹Εͨ࣌఺ͰActivity͕finishͯͨ͠ΒԿ΋͠·ͤΜΑͬͯͷΛ΍ͬͯ͘Ε·͢
  20. *NBHF7JFXͷ֦ுؔ਺ fun ImageView.loadImage(imageUrl: String, error: Int) {
 Picasso.with(context).load(imageUrl).error(error).into(this)
 }
 //

    Picassoを使ってイメージを読み込み
 imageView = imageView {
 loadImage("画像のURL", R.drawable.error)
 } ֦ுؔ਺Λ࢖༻͢Δ  Ͱɺ͖ͬ͞ݴͬͨΑ͏ʹKotlinͷίʔυͳΜͰɺྫ͑͹imageViewʹPicassoͰը૾ࡱ͖ͬͯͯ͘ΕΔ֦ுؔ਺࡞ͬͨͱ͖ͱ͔ʹ΋ɺී௨ʹAnkoͷதͰ࢖͑·͢ɻ
  21. *NBHF7JFXͷ֦ுؔ਺ fun ImageView.loadImage(imageUrl: String, error: Int) {
 Picasso.with(context).load(imageUrl).error(error).into(this)
 }
 //

    Picassoを使ってイメージを読み込み
 imageView = imageView {
 loadImage("画像のURL", R.drawable.error)
 } ֦ுؔ਺Λ࢖༻͢Δ  ,PUMJOͷԸܙΛͦͷ··ड͚ΕΔײ͡Ͱྑ͍ ͜ΕɹKotlinͷԸܙΛͦͷ··ड͚ΕΔײ͔ͩ͡Β Kotlinॻ͍͍ͯΔਓ͸ؾ࣋ͪྑ͍ͱࢥ͍·͢
  22. class MyListViewAdapter(var context:Context) : BaseAdapter() {
 
 override fun getView(position:Int,

    convertView: View?, parent: ViewGroup?):View? {
 var newConvertView:View?
 
 if (convertView == null) {
 var ui = MyListItemUI(getItem(position), position)
 newConvertView = ui.createView(context.UI { })
 newConvertView.tag = ui
 }else {
 newConvertView = convertView
 var ui = newConvertView.tag as MyListItemUI
 ui.label?.text = "List item: " + position
 newConvertView.tag = ui
 }
 return newConvertView
 }
 }
 
 class MyListItemUI(var user:User?,var position:Int) : AnkoComponent<Context> {
 var label : TextView? = null
 
 override fun createView(ui: AnkoContext<Context>) = with(ui) {
 verticalLayout {
 label = textView { text ="List item: " + position }
 }
 }
 }
 -JTU7JFXͰ࢖͏ྫ  ListViewͰͷ࢖͍ํ͕Θ͔ΒΜͬͯ࿩Λฉ͍ͨͷͰ΍ͬͯΈͨ AnkoComponentͷ෦෼͕ViewHolderʹͳͬͯΔΑ͏ͳײ͡ ͳΜ͔ඍົͱ͍͏͔ දࣔΛߋ৽͠ͳ͍ͱ͍͚ͳ͍෦෼͕ଟ͍ͱԸܙগͳ͍Α͏ͳؾ͕͢Δ
  23. DMBTT.Z"DUJWJUZ"QQ$PNQBU"DUJWJUZ \ MB[ZΛ࢖ͬͨ΄͏͕͍͍͔΋ WBMVJ.BJO"DUJWJUZ6JCZMB[Z\ .BJO"DUJWJUZ6J  ^ PWFSSJEFGVOPO$SFBUF TBWFE*OTUBODF4UBUF#VOEMF QFSTJTUFOU4UBUF1FSTJTUBCMF#VOEMF

    \ TVQFSPO$SFBUF TBWFE*OTUBODF4UBUF QFSTJTUFOU4UBUF  VJTFU$POUFOU7JFX UIJT  VJUFYU7JFX UFYUl"1*͔Βͱ͖ͬͯͨ஋ͱ͔z ^ ^ DMBTT.Z"DUJWJUZ6*"OLP$PNQPOFOU.Z"DUJWJUZ\ WBSUFYU7JFX5FYU7JFX OVMM PWFSSJEFGVODSFBUF7JFX VJ"OLP$POUFYU.Z"DUJWJUZ XJUI VJ \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ  ͳΜ͔͜Ε͸AnkoComponentΛ࣮૷͍ͯ͠ΔΫϥεΛAcitivityʹ΋ͨͤͯɹlazyʹͪ͠Όͬͨํ͕͍͍Μ͡Όͳ͍͔ͬͯ΍ͭͰ͢Ͷ
  24. DMBTT.Z"DUJWJUZ"QQ$PNQBU"DUJWJUZ \ MB[ZΛ࢖ͬͨ΄͏͕͍͍͔΋ WBMVJ.BJO"DUJWJUZ6JCZMB[Z\ .BJO"DUJWJUZ6J  ^ PWFSSJEFGVOPO$SFBUF TBWFE*OTUBODF4UBUF#VOEMF QFSTJTUFOU4UBUF1FSTJTUBCMF#VOEMF

    \ TVQFSPO$SFBUF TBWFE*OTUBODF4UBUF QFSTJTUFOU4UBUF  VJTFU$POUFOU7JFX UIJT  VJUFYU7JFX UFYUl"1*͔Βͱ͖ͬͯͨ஋ͱ͔z ^ ^ DMBTT.Z"DUJWJUZ6*"OLP$PNQPOFOU.Z"DUJWJUZ\ WBSUFYU7JFX5FYU7JFX OVMM PWFSSJEFGVODSFBUF7JFX VJ"OLP$POUFYU.Z"DUJWJUZ XJUI VJ \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 
  25. DMBTT.Z"DUJWJUZ"QQ$PNQBU"DUJWJUZ \ MB[ZΛ࢖ͬͨ΄͏͕͍͍͔΋ WBMVJ.BJO"DUJWJUZ6JCZMB[Z\ .BJO"DUJWJUZ6J  ^ PWFSSJEFGVOPO$SFBUF TBWFE*OTUBODF4UBUF#VOEMF QFSTJTUFOU4UBUF1FSTJTUBCMF#VOEMF

    \ TVQFSPO$SFBUF TBWFE*OTUBODF4UBUF QFSTJTUFOU4UBUF  VJTFU$POUFOU7JFX UIJT  VJUFYU7JFX UFYUl"1*͔Βͱ͖ͬͯͨ஋ͱ͔z ^ ^ DMBTT.Z"DUJWJUZ6*"OLP$PNQPOFOU.Z"DUJWJUZ\ WBSUFYU7JFX5FYU7JFX OVMM PWFSSJEFGVODSFBUF7JFX VJ"OLP$POUFYU.Z"DUJWJUZ XJUI VJ \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ  ͜ͷ෦෼ɹ֎͔ΒView࢖͍͍ͨͱ͖nullνΣοΫ͠ͳ͍ͱ͍͚ͳ͍Α͏ʹͳͬͪΌ͏ΜͰ ͜ΕͬͯͲ͏ͨ͠Β͍͍ͷ͔ͳͬͯײ͡ͷͱ͜ΖͰ͢Ͷ lateinitΛ͚ͭΕ͹͍͍ͷ͔ͳ? ͖ͬ͞ݴͬͯͨDelegationͷMapͰͳΜͱ͔Ͱ͖ͳ͍͔ͳ
  26. DMBTT.Z"DUJWJUZ"QQ$PNQBU"DUJWJUZ \ MB[ZΛ࢖ͬͨ΄͏͕͍͍͔΋ WBMVJ.BJO"DUJWJUZ6JCZMB[Z\ .BJO"DUJWJUZ6J  ^ PWFSSJEFGVOPO$SFBUF TBWFE*OTUBODF4UBUF#VOEMF QFSTJTUFOU4UBUF1FSTJTUBCMF#VOEMF

    \ TVQFSPO$SFBUF TBWFE*OTUBODF4UBUF QFSTJTUFOU4UBUF  VJTFU$POUFOU7JFX UIJT  VJUFYU7JFX UFYUl"1*͔Βͱ͖ͬͯͨ஋ͱ͔z ^ ^ DMBTT.Z"DUJWJUZ6*"OLP$PNQPOFOU.Z"DUJWJUZ\ WBSUFYU7JFX5FYU7JFX OVMM PWFSSJEFGVODSFBUF7JFX VJ"OLP$POUFYU.Z"DUJWJUZ XJUI VJ \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ  ͰAnkoComponent࣮૷͍ͯ͠ΔΫϥεͷϝϯόʹ͓͚ͯ͠͹ɺAPIͰ஋Λͱ͖ͬͯͯߋ৽ͱ͔Ͱ͖ΔΜͰ
  27. DMBTT.Z"DUJWJUZ"QQ$PNQBU"DUJWJUZ \ MB[ZΛ࢖ͬͨ΄͏͕͍͍͔΋ WBMVJ.BJO"DUJWJUZ6JCZMB[Z\ .BJO"DUJWJUZ6J  ^ PWFSSJEFGVOPO$SFBUF TBWFE*OTUBODF4UBUF#VOEMF QFSTJTUFOU4UBUF1FSTJTUBCMF#VOEMF

    \ TVQFSPO$SFBUF TBWFE*OTUBODF4UBUF QFSTJTUFOU4UBUF  VJTFU$POUFOU7JFX UIJT  VJUFYU7JFX UFYUl"1*͔Βͱ͖ͬͯͨ஋ͱ͔z ^ ^ DMBTT.Z"DUJWJUZ6*"OLP$PNQPOFOU.Z"DUJWJUZ\ WBSUFYU7JFX5FYU7JFX OVMMຊ౰͸͜͜ͰOVMMΛೖΕͨ͘ͳ͍ʜʜԿ͔͍͍ํ๏͸ PWFSSJEFGVODSFBUF7JFX VJ"OLP$POUFYU.Z"DUJWJUZ XJUI VJ \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 
  28. class ViewBinder<M>(val function: (M) -> Unit) : ReadWriteProperty<Any, M> {


    private var mValue: M? = null
 
 override fun getValue(thisRef: Any, property: KProperty<*>): M = mValue as M
 
 override fun setValue(thisRef: Any, property: KProperty<*>, value: M) {
 mValue = value
 function(value)
 }
 } /////////////////////////////////////// var user: User? by ViewBinder {
 // userのセッターが呼ばれた時にこの関数が呼ばれる
 // このときActivityがクローズされていたら?
 // activityUiThreadWithContextの中で呼ぶこと
 
 when (it) {
 null -> {
 
 }
 else -> {
 ui.textView?.apply {
 text = it?.name
 }
 }
 }
 } 7JFX#JOEFS  ͜Ε͸ Data Bindingͷ୅ΘΓʹɺDelegationΛ࢖ͬͯ Model͔ΒView΁ͷҰํ޲όΠϯσΟϯάΛ࡞ͬͨ΍ͭͰ͢Ͷ userΛߋ৽͢Δͱɹ͜ͷׅހͷதͷؔ਺ΛݺΜͰ͘ΕΔΜͰɺTextViewΛߋ৽ͯ͠·͢ɻ σʔλ͝ͱʹɺରԠ͢ΔViewΛߋ৽͢Δ͜ͷׅހͷதʹ·ͱΊͯॻ͚ΔΜͰɺҰํ޲όΠϯσΟϯάͳΒ Data BindingΑΓ΋͍͍͔΋͠Ε·ͤΜͶ