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
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
Search
Johnny Sung
June 30, 2019
Programming
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
(Kotlin EveryWhere 活動)
Johnny Sung
June 30, 2019
More Decks by Johnny Sung
See All by Johnny Sung
Escape RCA Writing Hell: Using MCP to Let AI Handle the Last Mile of Operations 告別 RCA 撰寫地獄:利用 MCP 讓 AI 替你完成維運最後一哩路 @ DevOpsDays 2026
j796160836
0
67
ArgoCD 新手村:告別手動部署,從 0 到 1 打造自動化部署路徑 @ CNTUG meetup #73
j796160836
0
41
CI/CD 落地指南:用開源 Jenkins & Ansible 打造自動化部署平台 @ DevOps Taiwan Meetup #76
j796160836
0
25
全端 AI 實戰:Gemini x Antigravity 快速開發與 PentestGPT 滲透攻防實務
j796160836
0
57
Event Driven Ansible (EDA) 使用情境分享 @ Red Hat Ansible User Club 線上交流會
j796160836
0
41
用 Gemma 3 開放模型來解決企業難解的問題 @ COSCUP 2025
j796160836
0
57
[GDG Build with AI] 善用現代 AI 科技:打造專屬行銷工具箱 @ GDG Changhua 彰化
j796160836
0
55
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
j796160836
0
99
地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63
j796160836
0
73
Other Decks in Programming
See All in Programming
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
590
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
120
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
230
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
どこまでゆるくて許されるのか
tk3fftk
0
500
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
380
関数型プログラミングのメリットって何だろう?
wanko_it
0
180
Performance Engineering for Everyone
elenatanasoiu
0
270
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
150
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
140
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
110
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Statistics for Hackers
jakevdp
799
230k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
350
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
360
Documentation Writing (for coders)
carmenintech
77
5.4k
A better future with KSS
kneath
240
18k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
180
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Transcript
炎炎夏⽇日學 Android Johnny Sung Part2: Android 元件介紹
Mobile Device developer Johnny Sung https://fb.com/j796160836 https://blog.jks.coffee/ https://www.slideshare.net/j796160836 https://github.com/j796160836
⼤大綱 • 軟體設計介紹 • Android 專案資料夾結構介紹 • Android 部件介紹
軟體設計 • 企劃 • UI/UX 介⾯面設計(美術) • 程式 • 測試
開⼀一個新專案吧!
None
None
專案資料夾結構 寫程式區 編譯資訊 / Logcat / Debug ⾯面版 / 搜尋⾯面板...等
資料夾結構 • app 模組 • AndroidManifest.xml • Kotlin 程式檔案 •
Gradle 設定檔檔案 • 畫⾯面 XML 檔案 ( res/layout ) • 圖片檔案 ( res/drawable ) • 字串串檔 ( res/values/strings.xml )
app 模組 AndroidManifest.xml Kotlin 程式檔案 單元測試 (Unit test) 檔案 Gradle
設定檔檔案 畫⾯面 XML 檔案 圖片檔案 字串串檔
畫⾯面 XML 檔案
Gradle 設定檔檔案(app 模組)
Gradle 設定檔檔案(專案)
Kotlin 程式檔案 (MainActivity.kt)
MVC
Model View Controller 控制器 模型 視圖
Controller View Model 控制器 模型 視圖 Activity Fragment
Layout
View 視圖
Layout • LinearLayout • FrameLayout • RelativeLayout • ConstraintLayout
LinearLayout 線性布局 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="wrap_content"/> <View
android:layout_width="match_parent" android:layout_height="wrap_content"/> <View android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
FrameLayout 框架布局 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="150sp" android:text="T"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="200sp" android:text="A"/> </FrameLayout>
Layout 畫⾯面參參數 android:layout_width="match_parent" android:layout_height="match_parent" 元件的⾼高度 元件的寬度 match_parent 符合⽗父親⼤大⼩小 wrap_content 符合內容⼤大⼩小
150dp 指定 dp 寬度(例例如:150dp) 0dp 依照特定規則執⾏行行
Layout 畫⾯面參參數 android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:layout_marginStart="5dp" android:layout_marginRight="5dp" android:layout_marginEnd="5dp" android:layout_marginBottom="5dp" Margin android:paddingTop="10dp"
android:paddingLeft="10dp" android:paddingStart="10dp" android:paddingRight="10dp" android:paddingEnd="10dp" android:paddingBottom="10dp" Padding
LinearLayout android:orientation="vertical" android:orientation="horizontal" 排列列⽅方向為⽔水平(由左⽽而右) 排列列⽅方向 排列列⽅方向為垂直(由上⽽而下)
RelativeLayout 相對布局 http://fiend1120.pixnet.net/blog/post/191809863 android:layout_above 將此元件置於"指定元件"(使⽤用元件id指定)上⽅方. android:layout_below 將此元件置於"指定元件"(使⽤用元件id指定)下⽅方. android:layout_toLeftOf 將此元件置於"指定元件"(使⽤用元件id指定)左⽅方. android:layout_toRightOf
將此元件置於"指定元件"(使⽤用元件id指定)右⽅方.
RelativeLayout 相對布局 http://fiend1120.pixnet.net/blog/post/191809863 android:layout_alignParentTop 將此元件對⿑齊於佈局畫⾯面上邊線 android:layout_alignParentRight 將此元件對⿑齊於佈局畫⾯面右邊線 android:layout_alignParentLeft 將此元件對⿑齊於佈局畫⾯面左邊線 android:layout_alignParentBottom
將此元件對⿑齊於佈局畫⾯面底線 android:layout_centerHorizontal 將該元件⽔水平居中於整個布局畫⾯面 android:layout_centerVertical 將該元件垂直居中於整個布局畫⾯面 android:layout_centerInParent 將該元件⽔水平及垂直均居中於整個布局畫⾯面
RelativeLayout 相對布局 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <View
android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/view1"/> <View android:id="@+id/view3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/view2"/> </RelativeLayout>
RelativeLayout • 對⿑齊類 android:layout_alignParentLeft 靠左對⿑齊,(吸附邊框左邊) android:layout_alignParentTop 靠上對⿑齊,(吸附邊框上⽅方) android:layout_alignParentRight 靠右對⿑齊,(吸附邊框右邊) android:layout_alignParentBottom
靠下對⿑齊,(吸附邊框下⽅方) android:layout_centerInParent 置中,(計算放在正中間)
TextView • android:text="Hello!" • android:background="#ff384c0a" • android:textColor="#ffe5d9ff" • android:textSize="35sp"
dp? px? 單位長度⼤大集合 • 螢幕長度 • px (pixel) 像素,RGB螢幕三原⾊色合成的⼀一個彩⾊色點 •
物理理長度 • inch (inches) 英吋,1 Inch = 2.54 cm • pt (points) 點數,1pt = 1/72 Inch = 0.352777778 mm
1px (pixel) 像素 http://img01.hc360.cn/01/busin/166/732/b/01-166732201.jpg
dp? px? 單位長度⼤大集合 • 密度 • dpi (dot per inch):⼀一英吋有幾個
點 • ppi (pixel per inch):⼀一英⼨寸有多少 像素
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead 密度 (Density)
密度 (Density) ( > 300dpi = Retina ) 160dpi (mdpi)
326dpi (xhdpi) iPhone 3Gs iPhone 4
dp? px? 單位長度⼤大集合 •dp, dip (Density-Independent Pixels) 對應到在 160 dpi
的螢幕上的幾個 px(像素) • 1 dp = 1/160 Inch = 0.15875 mm •sp (Scale Independent Pixels) 對應在 160 dpi 的螢幕上的幾個 pt。
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead 密度 (Density)
我的圖應該要多⼤大? • px = dip * (density / 160) •
dip = px / (density / 160) • sp = pt * (density / 160) • 2:3:4:6:8 scaling ratio
我的圖應該要多⼤大? • ldpi (low) ~120dpi • mdpi (medium) ~160dpi •
hdpi (high) ~240dpi • xhdpi (extra-high) ~320dpi • xxhdpi (extra-extra-high) ~480dpi • xxxhdpi (extra-extra-extra-high) ~640dpi https://www.pixplicity.com/dp-px-converter
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead
https://material.io/tools/devices/
https://www.pixplicity.com/dp-px-converter
Controller Activity Fragment 控制器
my_button.setOnClickListener { // ... } <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按⼀一下!"
/> import kotlinx.android.synthetic.main.activity_main.* activity_main.xml MainActivity.kt
findViewById
Android Lifecycle (⽣生命週期)
https://www.youtube.com/watch?v=6KMm0quizrQ
https://www.youtube.com/watch?v=6KMm0quizrQ
https://android.i-visionblog.com/trip-on-android-activity-life-cycle-%EF%B8%8F-3ea59a3261fb
https://android.i-visionblog.com/trip-on-android-activity-life-cycle-%EF%B8%8F-3ea59a3261fb
Thread 執⾏行行緒
https://www.taiwanviptravel.com/see-join-puppet-theater-restaurant-2/
https://flipedu.parenting.com.tw/article/4060 Main Thread (UI Thread) 主執⾏行行緒 Thread 1 Thread 2
Thread 3 ...
val mainHandler = Handler(Looper.getMainLooper()) val thread = Thread(Runnable { //
Do something mainHandler.post { // My result } }) thread.start() (把繁重的事情放在這) (回傳結果給 Main Thread 顯⽰示)
Model 模型
單元測試原則 • Arrange – 準備,準備輸入資料與期待值 • Act – 執⾏行行,執⾏行行測試對象 •
Assert – 驗證,驗證結果 3A 原則
class ExampleUnitTest { @Test fun addition_isCorrect() { // Arrange val
expected = 4 // Act val actual = 2 + 2 // Assert assertEquals(expected, actual) } } Arrange 準備 Act 執⾏行行 Aessrt 驗證
休息⼀一下 ☕
等等來來⼩小試⾝身⼿手!