Slide 1

Slide 1 text

"OLPʹ͸͞ΜͰ͸͞·Εͯ גࣜձࣾφνϡϥϧελΠϧ ࢁޱஐߦ

Slide 2

Slide 2 text

ࣗݾ঺հ w ࢁޱஐߦ w גࣜձࣾφνϡϥϧελΠϧॴଐ

Slide 3

Slide 3 text

࡞͍ͬͯΔ΋ͷ w ϑΝογϣϯίʔσΟωʔτ ΞϓϦʮ8&"3ʯΛ੡࡞

Slide 4

Slide 4 text

w ͔͜͜Βຊ୊

Slide 5

Slide 5 text

"OLP w ,PUMJOͷ%4-Ͱ"OESPJEͷ6*Λ૊ΈཱͯΔϥΠϒϥ Ϧ w +FU#SBJOTެࣜ w ·ͩόʔδϣϯ

Slide 6

Slide 6 text

"OLPͷϝϦοτ w 9.-Ͱͳ͍͜ͱʹΑΔϝϦοτ w 9.-Λύʔε͠ͳ͍͍ͯ͘ͷͰૣ͍ w pOE7JFX#Z*E͠ͳ͍͍ͯ͘ w ,PUMJOʹΑΔԸܙ w ܕ҆શ w /VMM҆શ w ػೳ֦ு͕༰қ w ϥΠϒϥϦʹศརͳؔ਺͕༻ҙ͞Ε͍ͯΔ

Slide 7

Slide 7 text

ͪͳΈʹ1SFWJFXػೳ΋͍͍ͭͯ·͢

Slide 8

Slide 8 text

ͪͳΈʹ1SFWJFXػೳ΋͍͍ͭͯ·͢ ͍ͭͯ·͚͢Ͳ

Slide 9

Slide 9 text

όʔδϣϯͩͱ͏·͘ಈ͔ͳ͔ͬͨͷͰ஫ҙɻ ͳΒ͏·͘ಈ͖·ͨ͠

Slide 10

Slide 10 text

9.-Λࣗಈม׵͢Δπʔϧ΋͋Δ $PEF$POWFSUUP,PBO%4-

Slide 11

Slide 11 text

9.-Λࣗಈม׵͢Δπʔϧ΋͋Δ $PEF$POWFSUUP,PBO%4- "OLP͡Όͳͯ͘ ,PBOʹͳ͍ͬͯΔͷ͸͓͖ͯ͞

Slide 12

Slide 12 text

ෆຬ఺ w %BUB#JOEJOHͱҰॹʹ͸࢖͑ͳ͍ w %FMFHBUFE1SPQFSUJFTΛ࢖͑͹ࣅͨΑ͏ͳ͜ͱ ͸Ͱ͖Δ͚ΕͲͪΐͬͱ໘౗ w 1SFWJFXͰ9.-Ͱͷ5PPMTଐੑͷΑ͏ͳ͜ͱ͕Ͱ͖ ͳ͍ w $POTUSBJOU-BZPVU͸Ͳ͏ͳΔ

Slide 13

Slide 13 text

࢖͍͔ͨ

Slide 14

Slide 14 text

override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 // ボタンを押したらトーストを表示
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 } "DUJWJUZͷதͰ࡞Δྫ 

Slide 15

Slide 15 text

class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent {
 override fun createView(ui: AnkoContext) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ 

Slide 16

Slide 16 text

class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent {
 override fun createView(ui: AnkoContext) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  JOUFSGBDF"OLP$PNQPOFOU5\ GVODSFBUF7JFX VJ"OLP$POUFYU5 7JFX ^

Slide 17

Slide 17 text

class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent {
 override fun createView(ui: AnkoContext) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ 

Slide 18

Slide 18 text

class MyActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
 super.onCreate(savedInstanceState, persistentState)
 MyActivityUI().setContentView(this)
 }
 }
 
 class MyActivityUI : AnkoComponent {
 override fun createView(ui: AnkoContext) = with(ui) {
 verticalLayout {
 val name = editText()
 button("Say Hello") {
 onClick { ctx.toast("Hello, ${name.text}!") }
 }
 }
 }
 } ΫϥεΛ෼͚ͨྫ  ΫϥεΛ෼͚ͯ΋1SFWJFX͸ಈ͖·͢

Slide 19

Slide 19 text

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Ͱ࢖͏ྫ 

Slide 20

Slide 20 text

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Ͱ࢖͏ྫ 

Slide 21

Slide 21 text

include(R.layout.something) {
 backgroundColor = Color.RED
 } 9.-ΛJODMVEF 

Slide 22

Slide 22 text

// 以下の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-ͷதͰ࢖͏ 

Slide 23

Slide 23 text

// 以下の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-ͷதͰ࢖͏ 

Slide 24

Slide 24 text

// 以下の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-ͷதͰ࢖͏ 

Slide 25

Slide 25 text

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Ͱ࢖͏ 

Slide 26

Slide 26 text

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Ͱ࢖͏ 

Slide 27

Slide 27 text

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Ͱ࢖͏ 

Slide 28

Slide 28 text

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Ͱ࢖͏ 

Slide 29

Slide 29 text

// 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("id" to 5) ศརͳػೳ 

Slide 30

Slide 30 text

// 非同期処理
 
 doAsync {
 // 何か重い処理
 
 // Acitivityがfinishしていたら呼ばれない
 activityUiThreadWithContext {
 result.text = "Done"
 }
 } ศརͳػೳ 

Slide 31

Slide 31 text

*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)
 } ֦ுؔ਺Λ࢖༻͢Δ 

Slide 32

Slide 32 text

*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ͷԸܙΛͦͷ··ड͚ΕΔײ͡Ͱྑ͍

Slide 33

Slide 33 text

͓ΘΓʹ w ,PUMJOͷ࿩୊͸੝Γ্͕͍ͬͯΔҹ৅

Slide 34

Slide 34 text

͓ΘΓʹ w "OLPͷ࿩ͬͯ͋·Γฉ͔ͳ͍

Slide 35

Slide 35 text

͓ΘΓʹ w 2JJUBͰͷهࣄ਺݅ͱ͔ͩͬͨ͠

Slide 36

Slide 36 text

͓ΘΓʹ w "OLP΋΋ͬͱ࿩୊ʹͳΔͱ͍͍ͳʂ

Slide 37

Slide 37 text

͓ΘΓʹ w ͦΜͳΘ͚Ͱ

Slide 38

Slide 38 text

͓ΘΓʹ w "OLPͷ࿩୊΋͸͞ΜͰ΄͍͠

Slide 39

Slide 39 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 40

Slide 40 text

͕࣌ؒ͋ͬͨΒ΍Δ

Slide 41

Slide 41 text

Ϩγʔό෇͖ؔ਺Ϧςϥϧ ֦ுؔ਺ ΛҾ਺ʹऔΔ ֦ுϓϩύςΟ ͍͍ͩͨ͜ͷ΁ΜͷػೳͰ࣮ݱ Ͳ͏΍͍ͬͯΔͷ͔ 

Slide 42

Slide 42 text

͘Θ͘͠͸͜ͷ͋ͨΓΛࢀর ,PUMJO,PBOTͷ#VJMEFSTͷষಛʹ)UNMCVJMEFSTͷ ෦෼ %4-ͷྫ  ,PUMJO"OESPJE"#SBTT5BDLT&YQFSJNFOU (PPHMFͷਓ͕ॻ͍ͨهࣄӳޠ Ͳ͏΍͍ͬͯΔͷ͔ 

Slide 43

Slide 43 text

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 {
 var label : TextView? = null
 
 override fun createView(ui: AnkoContext) = with(ui) {
 verticalLayout {
 label = textView { text ="List item: " + position }
 }
 }
 }
 -JTU7JFXͰ࢖͏ྫ 

Slide 44

Slide 44 text

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 \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 

Slide 45

Slide 45 text

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 \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 

Slide 46

Slide 46 text

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 \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 

Slide 47

Slide 47 text

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 \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 

Slide 48

Slide 48 text

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 \ লུ ^ ^ ΫϥεΛ෼͚ͨྫ 

Slide 49

Slide 49 text

class ViewBinder(val function: (M) -> Unit) : ReadWriteProperty {
 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