Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
複雑なレイアウト組む時あるあるは コンポーネント化で解決しよう
Search
ぎーにょ
March 19, 2019
Technology
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
複雑なレイアウト組む時あるあるは コンポーネント化で解決しよう
ぎーにょ
March 19, 2019
More Decks by ぎーにょ
See All by ぎーにょ
AndroidにおけるNotificationのおさらい & Android16の新API Progress-centric Notifications
ginyolith
0
230
Google IO 2022 Jetpack Composeのパフォーマンス 社内LT会資料
ginyolith
0
1.4k
各OS1人ずつ開発の辛みあるあるは アーキテクチャで解決出来そう
ginyolith
2
440
クリぼっちでも出来る issue駆動開発
ginyolith
0
600
Other Decks in Technology
See All in Technology
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
180
Baseline対応のDOMの型定義を作った
uhyo
2
650
スタートアップにおけるアジャイルの実践について #shibuyagile
murabayashi
3
2k
Claude Code 珍プレー好プレー
shinyasaita
0
120
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
0
500
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
1
330
知見・人・API・DB・予算 ─ ナイナイ尽くしだった人事データ整備 with dbt、5年間の学び
ken6377
1
150
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
360
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
200
Tech-Verse 2026_Keynote
lycorptech_jp
PRO
0
130
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
0
160
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
380
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
460
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
760
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Making Projects Easy
brettharned
120
6.7k
Un-Boring Meetings
codingconduct
0
330
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Everyday Curiosity
cassininazir
0
250
How to train your dragon (web standard)
notwaldorf
97
6.7k
Agile that works and the tools we love
rasmusluckow
331
22k
Transcript
ෳࡶͳϨΠΞτΉ࣌͋Δ͋Δ ίϯϙʔωϯτԽͰղܾ͠Α͏ ͋Δ͋ΔLTʙεϚϗΞϓϦ։ൃΤϯδχΞʙ VOL.3 2019/03/19 @GINYOLITH_TECH
ςΩετ SELF INTRODUCTION data class Ginyolith( val realName : String
= “Fumiya Akagi", val nickName : String = "ぎーにょ", var belongingTo : String = "株式会社アイリッジ", var position : String = "Androidアプリ開発", val loves : List<String> = mutableListOf( "写真", "アカペラ(音楽)", "インドカレー", "仮面ライダー"), val twitterId : String = "@ginyolith_tech" ) : Human()
AGENDA ࠓ͓͢Δࣄ ▸ ෳࡶͳϨΠΞτΛΉ࣌͋Δ͋Δ ▸ Style/CustomView/include/Fragment ͷಛੑ ▸ Style/CustomView/include/Fragment ͷ͍͚
▸ ݱࡏͷ՝
ARUARU ෳࡶͳϨΠΞτΛΉ࣌͋Δ͋Δ ▸ ωετ͗ͯ͢͠ҙຯෆ໌ʹͳΔlayout.xml ▸ େྔͷViewΛίϯτϩʔϧ͢ΔɺActivity/Fragment/ViewModel ▸ widthheightɺbackgroundͷઃఆʹσδϟϰΛײ͡Δࣄ͕ଟൃ ▸ Α͘Θ͔Μͳ͍͚Ͳdatabinding͕ಈ͔ͳ͍ʢٽʣ
HOW TO COMMONIZE VIEWS VIEWͷڞ௨Խͷํ๏ FRAGMENT INCLUDE STYLE CUSTOM VIEW
ACTIVITY DIMEN.XML
HOW TO COMMONIZE VIEWS ࠓ͓͢Δࣄ FRAGMENT INCLUDE STYLE CUSTOM VIEW
ͦΕͧΕԿ͕ग़དྷΔͷʁ Ͳ͏͍͚Δͷʁ
HOW TO COMMONIZE VIEWS STYLE ▸ ʮView Οϯυͷ֎؍ॻࣜΛࢦఆ͢ΔϓϩύςΟͷू߹ʯ by Google
Developers ▸ ThemeʹԠͯ͡ಈతʹ৭Λఆٛ͢Δ͜ͱՄೳ ▸ ϩδοΫঢ়ଶΛ࣋ͭ͜ͱෆՄೳɻ͋͘·ͰݟͨͷΈ੍ޚ
HOW TO COMMONIZE VIEWS - STYLE - View Οϯυͷ֎؍ॻࣜΛࢦఆ͢ΔϓϩύςΟͷू߹ <View
android:layout_height=“match_parent" android:layout_width="1dp" android:layout_marginBottom=“10dp" android:layout_marginTop=“10dp” android:background=“@color/borderGray”/> <View style="@styleAppTheme.Border.Gray"/>
HOW TO COMMONIZE VIEWS - STYLE - View Οϯυͷ֎؍ॻࣜΛࢦఆ͢ΔϓϩύςΟͷू߹ <View
android:layout_height=“match_parent" android:layout_width="1dp" android:layout_marginBottom=“10dp" android:layout_marginTop=“10dp” android:background=“@color/borderGray”/> <View style="@style/ AppTheme.Border.Gray"/> <style name="AppTheme.Border"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">1dp</item> <item name="android:layout_marginBottom">10dp</item> <item name="android:layout_marginTop">10dp</item> </style> <style name="AppTheme.Border.Gray" parent="AppTheme.Border"> <item name="android:background">@color/borderGray</item> </style>
HOW TO COMMONIZE VIEWS INCLUDE ▸ layout.xmlͰ࡞ͨ͠ϨΠΞτΛ͍·Θ͢ ▸ ϩδοΫΛแ͠ͳ͍ ▸
ϩδοΫͱϨΠΞτΛͯ͠ɺϩδοΫ͚ͩڞ༗Խ͕Մೳ ▸ ϩδοΫͰContextΛऔಘ͢Δͷ͕͍͠
HOW TO COMMONIZE VIEWS - INCLUDE - ϩδοΫΛแ͠ͳ͍ class UserViewModel()
{ val searchTerm :String fun search() { repository .search(searchTerm) } } <?xml version="1.0" encoding="utf-8"?> <layout> <data> <variable name="viewModel" type=“hoge.UserViewModel”/> </data> <android.support.constraint.ConstraintLayout> <Button android:onClick="@{() -> viewModel.search()}"/> </android.support.constraint.ConstraintLayout> </layout> component_user_search.xml <include layout=“@layout/component_user_search” app:viewModel="@{userViewModel}"/> ϩδοΫͱঢ়ଶΛ ࣋ͭΠϯελϯεΛೖՄ ೳ
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <variable name="viewModel" type=“hoge.UserViewModel”/> </data> <android.support.constraint.ConstraintLayout>
<Button android:onClick="@{() -> viewModel.search()}"/> </android.support.constraint.ConstraintLayout> </layout> HOW TO COMMONIZE VIEWS - INCLUDE - ϩδοΫͱϨΠΞτΛͯ͠ɺϩδοΫ͚ͩڞ༗Խ͕Մೳ component_user_search.xml <?xml version="1.0" encoding="utf-8"?> <layout> <data> <variable name="viewModel" type=“hoge.UserViewModel”/> </data> <android.support.constraint.ConstraintLayout> <TextView android:onClick="@{() -> viewModel.search()}"/> </android.support.constraint.ConstraintLayout> </layout> component_user_search_text.xml ΄΅ߏಉ͕ͩ͡ɺඍົʹݟ ͕ͨҟͳΔ ΄΅ߏಉ͕ͩ͡ɺ ඍົʹݟ͕ͨҟͳΔ
HOW TO COMMONIZE VIEWS - INCLUDE - ϩδοΫͱϨΠΞτΛͯ͠ɺϩδοΫ͚ͩڞ༗Խ͕Մೳ component_user_search.xml <include
layout="@layout/hoge" app:viewModel="@{userViewModel}"/> <include layout=“@layout/fuga" app:viewModel="@{userViewModel}"/> ΄΅ߏಉ͕ͩ͡ɺඍົʹݟ ͕ͨҟͳΔ ϩδοΫͷڞ௨ԽΛɺ ಛघͳॲཧΛॻ͔ͣʹߦ͏͜ͱ͕Մೳ component_user_search_text.xml
HOW TO COMMONIZE VIEWS CUSTOM VIEW ▸ ঢ়ଶͱϩδοΫΛแ ▸ contextΛ༻͍ͨϩδοΫΛ࣮ՄೳʢIntentͷൃߦͳͲʣ
▸ ಠࣗͷattributeΛఆٛग़དྷΔ ▸ طଘͷViewΛ֦ுͯ͠͏͜ͱՄೳ ▸ ViewGroupΛࣗ࡞͢ΔࣄՄೳ ੍͕গͳ͘ɺ෯͍ػೳͱҙຯΛͨͤΒΕΔ
HOW TO COMMONIZE VIEWS - CUSTOM VIEW - ঢ়ଶͱϩδοΫΛแ STYLE
VIEW INCLUDE VIEW VIEW VIEW LOGIC(INJECTED) CUSTOM VIEW VIEW VIEW VIEW LOGIC ATTRIBUTE LOGIC(INJECTED) UI
HOW TO COMMONIZE VIEWS - CUSTOM VIEW - ঢ়ଶͱϩδοΫΛแ CUSTOM
VIEW VIEW VIEW VIEW LOGIC ATTRIBUTE LOGIC(INJECTED) UI ViewͷΈ߹Θͤʢ୯ମViewՄʣ ViewͷݟͨɺଐੑɺStyle Viewݻ༗ͷଐੑΛఆٛՄೳ Viewʹݻ༗ϩδοΫΛΧϓηϧԽ OnClickListenerɺϩδοΫΛೖ
HOW TO COMMONIZE VIEWS FRAGMENT ▸ ಠࣗʹϥΠϑαΠΫϧΛ࣋ͭɻʢ།ҰϥΠϑαΠΫϧपΓͷॲཧΛΧϓηϧԽՄೳʣ ▸ Viewͱͷίϛϡχέʔγϣϯ͍͠ɻ ▸
ಛఆͷActivity/Fragement͔ΒͷΈݺͼग़ͤΔΑ͏ʹ͢Δରࡦ͕ඞཁ ▸ ϩδοΫΛೖग़དྷͳ͍ ▸ CustomViewStyleͱൺɺݟͨΛ͔Β੍ޚ͠ਏ͍ ಠཱੑ͕ߴ͍CUSTOMVIEW
Ͳ͏͍͚Ε͍͍ʁ ಛੑཧղͨ͠
COMPARISON OF COMMONIZING WAYS ൺֱ / Style include CustomView Fragment
LifecycleΛݕ × × ˚ ◦ View͔Βঢ়ଶΛ੍ޚ × ˚ ◦ × layout.xmlͰݟͨΛ੍ޚ ◦ × ◦ × ϩδοΫΛแ × × ◦ ◦ ϩδοΫΛೖ × ◦ ◦ × attr.xmlʹΑΔΧελϜཁૉ × × ◦ ×
COMPARISON OF COMMONIZING WAYS ൺֱ / Style include CustomView Fragment
LifecycleΛݕ × × ˚ ◦ View͔Βঢ়ଶΛ੍ޚ × ˚ ◦ × layout.xmlͰݟͨΛ੍ޚ ◦ × ◦ × ϩδοΫΛแ × × ◦ ◦ ϩδοΫΛೖ × ◦ ◦ × attr.xmlʹΑΔΧελϜཁૉ × × ◦ × ݟͨͷڞ௨ԽʹಛԽ
COMPARISON OF COMMONIZING WAYS ൺֱ / Style include CustomView Fragment
LifecycleΛݕ × × ˚ ◦ View͔Βঢ়ଶΛ੍ޚ × ˚ ◦ × layout.xmlͰݟͨΛ੍ޚ ◦ × ◦ × ϩδοΫΛแ × × ◦ ◦ ϩδοΫΛೖ × ◦ ◦ × attr.xmlʹΑΔΧελϜཁૉ × × ◦ × ϩδοΫΛೖՄೳ
COMPARISON OF COMMONIZING WAYS ൺֱ / Style include CustomView Fragment
LifecycleΛݕ × × ˚ ◦ View͔Βঢ়ଶΛ੍ޚ × ˚ ◦ × layout.xmlͰݟͨΛ੍ޚ ◦ × ◦ × ϩδοΫΛแ × × ◦ ◦ ϩδοΫΛೖ × ◦ ◦ × attr.xmlʹΑΔΧελϜཁૉ × × ◦ × Ұ௨Γग़དྷΔ
COMPARISON OF COMMONIZING WAYS ൺֱ / Style include CustomView Fragment
LifecycleΛݕ × × ˚ ◦ View͔Βঢ়ଶΛ੍ޚ × ˚ ◦ × layout.xmlͰݟͨΛ੍ޚ ◦ × ◦ × ϩδοΫΛแ × × ◦ ◦ ϩδοΫΛೖ × ◦ ◦ × attr.xmlʹΑΔΧελϜཁૉ × × ◦ × VIEW͔Βͷ੍ޚ ʹ੍͓͍ͯ
·ͱΊ
SUMMURY ڞ௨Խର͕ɾɾɾ ෳͷVIEWͷ Έ߹Θͤ STYLE NO Yes ϩδοΫΛ แ Yes
VIEW͔Βݟ ͨΛ੍ޚ INCLUDE NO NO FRAGMENT CUSTOM VIEW Yes
SUMMARY ·ͱΊ ▸ AndroidͷViewͷڞ௨Խʹ৭ʑͳํ๏͕͋Δ ▸ ੍ҙຯ͚ʹԠ͍͚ͯ͡Δͱ… ▸ Ϧʔμϒϧͳίϯϙʔωϯτʹ ▸ ༨ͳ࣮ΛͤͣΑΓޮతʹViewΛ࡞Մೳ
PROBLEMS ՝ ▸ component_ͩͬͨΓview_ͩͬͨΓɺ໋໊نଇ ͕όϥόϥ ▸ atomic designͷߟ͑ํΛద༻ͯ͠componentͷ ཻΛཧग़དྷͳ͍͔ߟ͍͑ͯΔ
THANK YOU FOR LISTENING!!