Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Anko試食会
Search
watanave
February 05, 2018
Programming
2.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Anko試食会
DroidKaigi 2018
watanave
February 05, 2018
More Decks by watanave
See All by watanave
Figma Dev Modeで変わる!Flutterの開発体験
watanave
0
5.4k
Flutter実践開発に書かなかったこと
watanave
0
90
Flutterビギナーのための Widget完全攻略
watanave
0
65
決めず、語らずのリーダーシップ
watanave
0
590
複数プロジェクトを横断するゆめみテックリードの戦略
watanave
0
140
Androidエンジニア目線のKMM / iOSエンジニア目線のKMM
watanave
0
380
Why does Activity die soon?
watanave
0
390
Other Decks in Programming
See All in Programming
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
150
SODA - FACT BOOK(JP)
sodainc
1
40k
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
200
ChromeでローカルLLM
ryu1013
0
200
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
240
SODA - FACT BOOK(EN)
sodainc
1
220
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.6k
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
flutter_test のその先へ — Flutter アプリの LLM 機能に「評価」という品質保証を
kosukesaigusa
0
200
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
150
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.8k
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Between Models and Reality
mayunak
4
570
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
580
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
470
Claude Code のすすめ
schroneko
67
230k
Practical Orchestrator
shlominoach
192
12k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
370
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
650
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
480
Transcript
"OLPࢼ৯ձ %SPJE,BJHJ XBUBOBWF
:PIUB8BUBOBCF $SZQUPO'VUVSF.FEJB *OD UXJUUFS!4VTBO@KBDLP HJUIVC!TVTBO
"OLPJTB,PUMJOMJCSBSZXIJDINBLFT"OESPJEBQQMJDBUJPOEFWFMPQNFOUGBTUFS BOEFBTJFS*UNBLFTZPVSDPEFDMFBOBOEFBTZUPSFBE BOEMFUTZPVGPSHFU BCPVUSPVHIFEHFTPGUIF"OESPJE4%,GPS+BWB
͜Μͳํ w,PUMJOͦͦ͑͜͜Δ w"OLPͬͨ͜ͱͳ͍ w"OLP%4-ͬͯ ढจʹݟ͑Δʜ
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
"OLP "OLP $PNNPOT "OLP -BZPVUT "OLP 42-JUF "OLP $PSPVUJOFT
"OLP-BZPVUT "OLP%4-
"OLP-BZPVUT "OLP%4- 7JFXͷϨΠΞτΛ࡞Δ ಠࣗυϝΠϯݴޠ ͬͱݴͬͯɺ ,PUMJOͷߏจ্ʹΓཱ͍ͬͯΔ
"OLP%4-
None
9.- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical" tools:context="jp.watanave.ankosamples.XMLActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="SAY hello"/> </LinearLayout>
"OLP%4- verticalLayout { editText() button("Say Hello") }
<LinearLayout xmlns:android="http://schemas.android.com/ apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="jp.watanave.ankosamples.XMLActivity"> <EditText android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="SAY hello"/> </LinearLayout> verticalLayout { editText() button("Say Hello") } 9.- "OLP%4-
<LinearLayout > <EditText/> <Button/> </LinearLayout> verticalLayout { editText() button("Say Hello")
} 9.- "OLP%4-
<LinearLayout > <EditText/> <Button/> </LinearLayout> verticalLayout { editText() button("Say Hello")
} 9.- "OLP%4-
<LinearLayout > <EditText/> <Button/> </LinearLayout> verticalLayout { editText() button("Say Hello")
} 9.- "OLP%4- งғؾࣅͯΔ
͏গ͠ৄ͘͠
9.- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="@android:color/darker_gray" tools:context="jp.watanave.ankosamples.XMLActivity"> <TextView
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/red" android:textColor="#FF0000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/white" android:textColor="#FFFFFF"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yellow" android:textColor="#FFFB00"/> </LinearLayout>
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }
"OLP%4- ϒϨʔεͰ֊Λදݱ linearLayout { backgroundColor = Color.DKGRAY textView { text
= "͔͋" textColor = Color.RED } }
"OLP%4- ϒϨʔεͰ֊Λදݱ linearLayout { backgroundColor = Color.DKGRAY textView { text
= "͔͋" textColor = Color.RED } }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } } ϒϨʔεͷதͰϓϩύςΟηοτ linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } } textView { text = “͔͋" textColor = Color.RED }
"OLP%4- ϒϨʔεͷதͰϓϩύςΟηοτ textView { text = “͔͋" textColor = Color.RED
}
"OLP%4- ϒϨʔεͷதͰϓϩύςΟηοτ view { ϓϩύςΟ = }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED } textView { text = "͠Ζ" textColor = Color.WHITE } textView { text = "͖͍Ζ" textColor = Color.YELLOW } }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } } textView { text = "͔͋" textColor = Color.RED }.lparams { margin = dip(10) }
"OLP%4- MQBSBNTʹଓ͚ͯϨΠΞτͷઃఆ textView { text = "͔͋" textColor = Color.RED
}.lparams { margin = dip(10) }
"OLP%4- MQBSBNTʹଓ͚ͯϨΠΞτͷઃఆ view { }.lparams { LayoutParamsͷϓϩύςΟ = }
"OLP$PNQPOFOU interface AnkoComponent<in T> { fun createView(ui: AnkoContext<T>): View }
"OLP$PNQPOFOU class MyActivity : AppCompatActivity() { // ུ }
"OLP$PNQPOFOU class MyActivity : AppCompatActivity() { // ུ } class
MyActivityUI : AnkoComponent<MyActivity> { } class MyActivity : AppCompatActivity() { // ུ } class MyActivityUI : AnkoComponent<MyActivity> { }
"OLP$PNQPOFOU class MyActivity : AppCompatActivity() { // ུ } class
MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } } class MyActivity : AppCompatActivity() { // ུ } class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } }
"OLP$PNQPOFOU class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) } } class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } } class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } } class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } }
"OLP$PNQPOFOU class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) MyActivityUI().setContentView(this) } } class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } } class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MyActivityUI().setContentView(this) } } class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View { // DSLॻ͘ } }
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
"OLPͷ͕͜͜ྑ͍ w 9.-͔Βͷղ์ w ܕ҆શ w ಈతͳϨΠΞτ͕ಘҙ w ϨΠΞτͷ࠶ར༻ੑ͕ߴ͘ͳΔ
"OLPͷ͕͜͜੯͍͠ w ϓϨϏϡʔ͕ʜ w 7JFX*%ͷ࠾൪ʹ͋Γ
"OLP2"
ΧελϜ7JFX ѻ͑Δʁ :&4!
ύϑΥʔϚϯε Ͳ͏ͳͷʁ :&4"
"OLPͰ Ͱ͖ͳ͍ࣄ͋Δʁ Ίͳ͍ϨΠΞτ ଟɺͳ͍
"OLPͰ Ͱ͖ͳ͍ࣄ͋Δʁ ΞϓϦͷϓϩηε֎Ͱ ಈ࡞͢Δॴ# w ΧελϜ௨ϨΠΞτ w "QQ8JEHFUTͷϨΠΞτ
ϓϨϏϡʔਏ͘ͳ͍ʁ 㵰'ͰؤுΔ$
ϓϩδΣΫτͰ࠾༻ͯ͠ Ͳ͏ͩͬͨʁ ͬͱɺఏҊͨ͠ࢲࢥͬͯΔ ྑ͔ͬͨ%
ϓϩδΣΫτͰ࠾༻ͯ͠ Ͳ͏ͩͬͨʁ wֶशίετɺ͋Δ& wωοΫϓϨϏϡʔ͔' w7JFX͕͍·ΘͤΔͷྑ͍( w9.-Ͱফͯ͠ΔͳΒ͏͔͠ͳ͍)
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
"OLPղମγϣʔ linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } }
MJOFBS-BZPVUΛ࡞Δϝιου class AnkoContext(val ctx: Context) { fun linearLayout() : LinearLayout
{ return LinearLayout(ctx) } }
MJOFBS-BZPVUΛ࡞Δϝιου class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } }
MJOFBS-BZPVUΛίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { ui.linearLayout ({ // do something }) }
%4-ͬΆ͘ίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { ui.linearLayout ({ // do something }) } fun createView(ui: AnkoContext) { ui.linearLayout ({ // do something }) }
%4-ͬΆ͘ίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { ui.linearLayout { // do something } } ɹɹ
XJUI inline fun <T, R> with(receiver: T, block: T.() ->
R): R (source) rIUUQTLPUMJOMBOHPSHBQJMBUFTUKWNTUEMJCLPUMJOXJUIIUNM l༩͑ΒΕͨϨγʔόΛϨγʔόͱͯ͠ࢦఆͨ͠ϑΝϯ ΫγϣϯϒϩοΫΛݺͼग़͠ɺͦͷ݁ՌΛฦ͠·͢ɻz
XJUI CMPDLͷείʔϓͰɺ UIJT͕SFDFJWFSʹͳΔ inline fun <T, R> with(receiver: T, block:
T.() -> R): R (source)
%4-ͬΆ͘ίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { ui.linearLayout { // do something } }
XJUIͬͯΈΔ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { with(ui, { this.linearLayout { // do something } }) } ui { this.linearLayout { // do something } }
୯Ұࣜؔͩͬͨ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) { with(ui, { this.linearLayout { // do something } }) } with(ui, { this.linearLayout { // do something } })
୯Ұࣜؔ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui, { this.linearLayout { // do something } })
ͬͱ%4-ͬΆ͘ίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui, { this.linearLayout { // do something } })
ͬͱ%4-ͬΆ͘ίʔϧ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { this.linearLayout { // do something } }
ͬͱͬͱ%4-ͬΆ͘ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { // do something } }
ϓϩύςΟͲ͏ͬͯʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { } } backgroundColor = Color.DKGRAY
͜Εҧ͏ʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { linearLayout -> linearLayout.backgroundColor = Color.DKGRAY } }
͜Εҧ͏ʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { linearLayout -> with(linearLayout) { this.backgroundColor = Color.DKGRAY } } }
JOJUͷUIJTΛ-JOFBS-BZPVUʹ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { // ͜ͷείʔϓͷthisΛLinearLayoutʹ͍ͨ͠ʂ } }
ϓϩύςΟͲ͏ͬͯʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: ()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { } }
ϓϩύςΟͲ͏ͬͯʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
LinearLayout { return LinearLayout(ctx) } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { } }
ϓϩύςΟͲ͏ͬͯʁ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
LinearLayout { val linearLayout = LinearLayout(ctx) linearLayout.init() return linearLayout } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { backgroundColor = Color.DKGRAY } } this.
5FYU7JFXΛஔ͍ͨ͠ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
LinearLayout { val linearLayout = LinearLayout(ctx) linearLayout.init() return linearLayout } } fun createView(ui: AnkoContext) = with(ui) { linearLayout { backgroundColor = Color.DKGRAY } } textView { text = "͋Μ͜" }
5FYU7JFX࣮ͯ͠ΈΔ fun linearLayout(init: LinearLayout.()->Unit) : LinearLayout { val linearLayout =
LinearLayout(ctx) linearLayout.init() return linearLayout } fun textView(init: TextView.()->Unit) : TextView { val textView = TextView(ctx) textView.init() return textView }
5FYU7JFX࣮ͯ͠ΈΔ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
LinearLayout { val linearLayout = LinearLayout(ctx) linearLayout.init() return linearLayout } } fun ViewGroup.textView(init: TextView.()->Unit) : TextView { val textView = TextView(this.context) textView.init() return textView }
"EE7JFXͯ͠ͳ͔ͬͨ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
LinearLayout { val linearLayout = LinearLayout(ctx) linearLayout.init() (ctx as Activity).setContentView(linearLayout) return linearLayout } } fun ViewGroup.textView(init: TextView.()->Unit) : TextView { val textView = TextView(this.context) textView.init() this.addView(textView) return textView }
ೖΕࢠߏͰ͖ͨ fun createView(ui: AnkoContext) = with(ui) { return linearLayout {
backgroundColor = Color.DKGRAY textView { text = “͋Μ͜" } } }
MQBSBNTΛͲ͏͢Δ͔ fun createView(ui: AnkoContext) = with(ui) { linearLayout { backgroundColor
= Color.DKGRAY textView { text = “͋Μ͜" }.lparams { } } }
5FYU7JFXΛ֦ு fun TextView.lparams(init: LinearLayout.LayoutParams.() -> Unit): TextView { val layoutParams
= LinearLayout.LayoutParams(width, height) layoutParams.init() this.layoutParams = layoutParams return this } fun createView(ui: AnkoContext) = with(ui) { linearLayout { backgroundColor = Color.DKGRAY textView { text = “͋Μ͜" }.lparams { } } }
ܕҧ͏ fun TextView.lparams(init: LinearLayout.LayoutParams.() -> Unit): TextView { val layoutParams
= LinearLayout.LayoutParams(width, height) layoutParams.init() this.layoutParams = layoutParams return this } fun createView(ui: AnkoContext) = with(ui) { relativeLayout { backgroundColor = Color.DKGRAY textView { text = “͋Μ͜" }.lparams { } } } #
class _LinearLayout(context: Context) : LinearLayout(context) { fun TextView.lparams(init: LinearLayout.LayoutParams.() ->
Unit): TextView { val layoutParams = LinearLayout.LayoutParams() layoutParams.init() this.layoutParams = layoutParams return this } } @ΫϥεΛ࡞Δ
@ΫϥεΛฦ͢ class AnkoContext(val ctx: Context) { fun linearLayout(init: LinearLayout.()->Unit) :
_LinearLayout { val linearLayout = _LinearLayout(ctx) linearLayout.init() return linearLayout } }
class _FrameLayout(context: Context) : FrameLayout(context) { fun TextView.lparams(init: FrameLayout.LayoutParams.() ->
Unit): TextView { class _RelativeLayout(context: Context) : RelativeLayout(context) { fun TextView.lparams(init: RelativeLayout.LayoutParams.() -> Unit): TextView { class _LinearLayout(context: Context) : LinearLayout(context) { fun TextView.lparams(init: LinearLayout.LayoutParams.() -> Unit): TextView { class _LinearLayout(context: Context) : LinearLayout(context) { fun TextView.lparams(init: LinearLayout.LayoutParams.() -> Unit): TextView { class _FrameLayout(context: Context) : FrameLayout(context) { fun TextView.lparams(init: FrameLayout.LayoutParams.() -> Unit): TextView { class _RelativeLayout(context: Context) : RelativeLayout(context) { fun TextView.lparams(init: RelativeLayout.LayoutParams.() -> Unit): TextView {
linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋"
textColor = Color.RED }.lparams { weight = 1.0f } // ུ } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }.lparams { weight = 1.0f } // ུ }
relativeLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋"
textColor = Color.RED }.lparams { centerInParent() } // ུ } relativeLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }.lparams { centerInParent() } // ུ }
"OLP%4- linearLayout { backgroundColor = Color.DKGRAY textView { text =
"͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } } linearLayout { backgroundColor = Color.DKGRAY textView { text = "͔͋" textColor = Color.RED }.lparams { margin = dip(10) } textView { text = "͠Ζ" textColor = Color.WHITE }.lparams { margin = dip(10) } textView { text = "͖͍Ζ" textColor = Color.YELLOW }.lparams { margin = dip(10) } }
%4- w ҾϥϜμࣜͷΧοίলུه๏ w είʔϓຖͷUIJTࢀরΓସ͑ Ͱग़དྷͯΔ
ࠔͬͨΒ είʔϓͷUIJTΛ ҙࣝ͢Δ
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
ܕ҆શ
ܕ҆શ class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>):
View = with(ui) { verticalLayout { textView("0") button("OK") } } }
ܕ҆શ class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>):
View = with(ui) { verticalLayout { val textView = textView("0") val button = button("OK") } } }
ܕ҆શ class MyActivityUI : AnkoComponent<MyActivity> { var textView: TextView? var
button: Button? override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { textView = textView("0") button = button("OK") } } }
ܕ҆શ class MyActivityUI : AnkoComponent<MyActivity> { lateinit var textView: TextView
private set lateinit var button: Button private set override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { textView = textView("0") button = button("OK") } } }
ಈతͳϨΠΞτ
ಈతͳϨΠΞτ linearLayout { (0..num).forEach { imageView(R.drawable.star) } }
ಈతͳϨΠΞτ class MyActivityUI(private val theme: Int, private val buttonTheme: Int)
: AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { owner.setTheme(theme) verticalLayout { textView("0") button(“OK") themedButton("Cancel", buttonTheme) } } }
ಈతͳϨΠΞτ class MyActivityUI(private val theme: Int, private val buttonTheme: Int)
: AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { owner.setTheme(theme) verticalLayout { textView("0") button(“OK") themedButton("Cancel", buttonTheme) } } }
ಈతͳϨΠΞτ class MyActivityUI(private val theme: Int, private val buttonTheme: Int)
: AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { owner.setTheme(theme) verticalLayout { textView("0") button(“OK") themedButton("Cancel", buttonTheme) } } }
ಈతͳϨΠΞτ class MyActivityUI(private val theme: Int, private val buttonTheme: Int)
: AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { owner.setTheme(theme) verticalLayout { textView("0") button(“OK") themedButton("Cancel", buttonTheme) } } }
ϨΠΞτͷ࠶ར༻
ϨΠΞτͷ࠶ར༻
ϨΠΞτͷ࠶ར༻ ਅΜதʹஔ͢Δ7JFX͚ͩҧ͏
ϨΠΞτͷ࠶ར༻ interface SampleUI<in T> : AnkoComponent<T> { override fun createView(ui:
AnkoContext<T>): View = with(ui) { relativeLayout { imageView(R.drawable.zebra) { scaleType = ImageView.ScaleType.FIT_XY }.lparams(width = matchParent, height = matchParent) createInnerView().lparams { centerInParent() } } } fun _RelativeLayout.createInnerView() : View }
ϨΠΞτͷ࠶ར༻ interface SampleUI<in T> : AnkoComponent<T> { override fun createView(ui:
AnkoContext<T>): View = with(ui) { relativeLayout { imageView(R.drawable.zebra) { scaleType = ImageView.ScaleType.FIT_XY }.lparams(width = matchParent, height = matchParent) createInnerView().lparams { centerInParent() } } } fun _RelativeLayout.createInnerView() : View }
ϨΠΞτͷ࠶ར༻ interface SampleUI<in T> : AnkoComponent<T> { override fun createView(ui:
AnkoContext<T>): View = with(ui) { relativeLayout { imageView(R.drawable.zebra) { scaleType = ImageView.ScaleType.FIT_XY }.lparams(width = matchParent, height = matchParent) createInnerView().lparams { centerInParent() } } } fun _RelativeLayout.createInnerView() : View }
ϨΠΞτͷ࠶ར༻ class Sample1UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View
= with(this) { button("Button") } } class Sample2UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View = with(this) { textView("text") } } class Sample3UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View = with(this) { progressBar() } }
ϨΠΞτͷ࠶ར༻ class Sample1UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View
= with(this) { button("Button") } } class Sample2UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View = with(this) { textView("text") } } class Sample3UI: SampleUI<Context> { override fun _RelativeLayout.createInnerView() : View = with(this) { progressBar() } }
ϨΠΞτͷ࠶ར༻
ϨΠΞτͷ࠶ར༻
ϨΠΞτͷ࠶ར༻
ϨΠΞτͷ࠶ར༻ class HourlyWeatherView(context: Context) : _LinearLayout(context) { val hourTextView: TextView
val imageView: ImageView val tempTextView: TextView init { // DSL͔͘ } }
ϨΠΞτͷ࠶ར༻ class HourlyWeatherView(context: Context) : _LinearLayout(context) { val hourTextView: TextView
val imageView: ImageView val tempTextView: TextView init { // DSL͔͘ } }
ϨΠΞτͷ࠶ར༻ class HourlyWeatherView(context: Context) : _LinearLayout(context) { val hourTextView: TextView
val imageView: ImageView val tempTextView: TextView init { // DSL͔͘ } }
ϨΠΞτͷ࠶ར༻ fun ViewManager.hourlyWeatherView() = customView(theme = 0) {} inline fun
ViewManager.hourlyWeatherView(init: HourlyWeatherView.()->Unit) : HourlyWeatherView { return ankoView({ HourlyWeatherView(it) }, theme = 0, init = init) } %4-Ͱ͑ΔΑ͏ʹ
ϨΠΞτͷ࠶ར༻ class WeatherActivityUI: AnkoComponent<WeatherActivity> { var hourlyWeatherViews = arrayListOf<HourlyWeatherView>() override
fun createView(ui: AnkoContext<WeatherActivity>): View = with(ui) { linearLayout { hourlyWeatherView().let { hourlyWeatherViews(it) } hourlyWeatherView().let { hourlyWeatherViews(it) } hourlyWeatherView().let { hourlyWeatherViews(it) } hourlyWeatherView().let { hourlyWeatherViews(it) } hourlyWeatherView().let { hourlyWeatherViews(it) } } } }
ϨΠΞτͷ࠶ར༻
ຊͷ"OLPϝχϡʔ w"OLPͷհ w"OLP͍ʹͳΔͷ͔ w"OLPղମγϣʔ w"OLPͳΒͰͷ׆༻๏ w7JFX*%ͷ࠾൪
͜Μͳͱ͖7JFX*E͕ཁΔ w 3FMBUJWF-BZPVUͰ૬ରҐஔΛࢦఆ͢Δͱ͖ w 'SBHNFOUͷ$POUBJOFSΛࢦఆ͢Δͱ͖
7JFX*%ͷ࠾൪ wҰݸͣͭఆ࡞Δ w7JFXHFOFSBUF7JFX*E wίʔυͷߦ൪߸
ఆΛ༻ҙ class MyActivityUI : AnkoComponent<MyActivity> { private object Ids {
val editText = 1 val button = 2 } override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { editText { id = Ids.editText } button("OK") { id = Ids.button } } } }
ఆΛ༻ҙ class MyActivityUI : AnkoComponent<MyActivity> { private object Ids {
val editText = 1 val button = 2 } override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { editText { id = Ids.editText } button("OK") { id = Ids.button } } } }
ఆΛ༻ҙ wγϯϓϧ! w࣮͕໘͍͘͞*
7JFXHFOFSBUF7JFX*E class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>):
View = with(ui) { verticalLayout { editText { id = View.generateViewId() } button("OK") { id = View.generateViewId() } } } }
7JFXHFOFSBUF7JFX*E class MyActivityUI : AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>):
View = with(ui) { verticalLayout { editText { id = View.generateViewId() } button("OK") { id = View.generateViewId() } } } }
7JFXHFOFSBUF7JFX*E w࣮͕ϥΫνϯ! w"DUJWJUZͷ࠶ੜͰ ͕ى͜Δ كʹ *
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU *E9
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU .Z'SBHNFOU #VOEMF *E9 PO4BWFE*OTUBODF4UBUF .Z'SBHNFOU $POUBJOFS*E9
7JFXHFOFSBUF7JFX*E #VOEMF "DUJWJUZ͕ഁغ͞Εͯʜ .Z'SBHNFOU $POUBJOFS*E9
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU .Z'SBHNFOU $POUBJOFS*E9 #VOEMF PO3FTUPSF*OTUBODF4UBUF
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU .Z'SBHNFOU $POUBJOFS*E9 #VOEMF PO3FTUPSF*OTUBODF4UBUF *E:
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU .Z'SBHNFOU $POUBJOFS*E9 #VOEMF 'SBHNFOUͷ$POUBJOFS*E͕มΘͬͯΔʂ *E:
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU 5FYU7JFX 5FYU7JFX *E9 .Z'SBHNFOU $POUBJOFS*E9 #VOEMF *E:
7JFXHFOFSBUF7JFX*E 'SBNF-BZPVU .Z'SBHNFOU 5FYU7JFX 5FYU7JFX *E9 .Z'SBHNFOU $POUBJOFS*E9 #VOEMF *E:
$MBTT$BTU&YDFQUJPO
ίʔυͷߦ൪߸ inline fun generateViewId(): Int = Throwable().stackTrace.first().lineNumber class MyActivityUI :
AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { editText { id = generateViewId() } button("OK") { id = generateViewId() } } } } -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable
ίʔυͷߦ൪߸ inline fun generateViewId(): Int = Throwable().stackTrace.first().lineNumber class MyActivityUI :
AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { editText { id = generateViewId() } button("OK") { id = generateViewId() } } } } -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable
ίʔυͷߦ൪߸ inline fun generateViewId(): Int = Throwable().stackTrace.first().lineNumber class MyActivityUI :
AnkoComponent<MyActivity> { override fun createView(ui: AnkoContext<MyActivity>): View = with(ui) { verticalLayout { editText { id = generateViewId() } button("OK") { id = generateViewId() } } } } -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable
ίʔυͷߦ൪߸ w࣮͕ϥΫνϯ! w7JFX*E͔ͿΔՄೳੑΞϦ*
None