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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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ΑΓ΋͍͍͔΋͠Ε·ͤΜͶ