最近把kotlin學(xué)習(xí)了一遍酪惭,參照谷歌的安卓官網(wǎng)教程進(jìn)行自學(xué)安卓希痴,在此記錄學(xué)習(xí)過程中遇到的一些問題,以及一些好用的東西春感。
本人從事iOS開發(fā)已經(jīng)四年多了砌创,斷斷續(xù)續(xù)也學(xué)習(xí)了前端的一些框架虏缸,React、Flutter嫩实、Taro刽辙。將會(huì)把安卓開發(fā)過程中的一些知識(shí)點(diǎn)匯集在這里,共勉甲献,共同進(jìn)步宰缤。
安卓中的布局
布局在以 xml
后綴文件中,可以在 Design 的模式下晃洒,通過拖動(dòng) Palette 面板中的控件來快速創(chuàng)建一些界面慨灭。也可以切換到 code
模式下,手寫布局文件進(jìn)行布局球及。
安卓中的樣式
安卓中的樣式可以在 Design 的模式下氧骤,使用右側(cè)面板進(jìn)行 Attributes 和一些基礎(chǔ)設(shè)置,可以將設(shè)置 padding 桶略、margin 语淘、字體大小 等,可以通過抽取
可以直接導(dǎo)出樣式
管理字符串
安卓中的圖片兼容
展開res文件夾际歼,然后展開drawable惶翻,默認(rèn)情況下這些文件為矢量可繪制對(duì)象。矢量可繪制對(duì)象相對(duì)于位圖圖像格式(如PNG)的好處是鹅心,矢量可繪制對(duì)象可以縮放而不損失質(zhì)量吕粗。同樣,矢量可繪制對(duì)象通常是一個(gè)比位圖格式的相同圖像小的文件旭愧。
關(guān)于矢量可繪制對(duì)象的重要注意事項(xiàng)是API 21及更高版本支持它們颅筋。但是,應(yīng)用程序的最低SDK設(shè)置為API19输枯。如果您在API 19設(shè)備或仿真器上嘗試過該應(yīng)用程序议泵,則會(huì)發(fā)現(xiàn)該應(yīng)用程序似乎可以正常構(gòu)建和運(yùn)行。那么這是如何工作的呢桃熄?
一先口、打開 build.gradle(Module:app)。將此行添加到以下defaultConfig部分:
vectorDrawables.useSupportLibrary = true
二瞳收、點(diǎn)擊右上角的 Sync Now
三碉京、打開 .xml 文件,在根控件中輸入
xmlns:app="http://schemas.android.com/apk/res-auto"
四螟深、在使用<ImageVIew>
的部分將 android:src
修改為
app:srcCompat="@drawable/empty_dice"
生成并運(yùn)行應(yīng)用程序谐宙。不會(huì)在屏幕上看到任何不同,但是現(xiàn)在應(yīng)用程序無論在何處運(yùn)行都無需使用生成的PNG文件來生成圖像界弧,這意味著應(yīng)用程序文件更小凡蜻。
這一段摘自官方 Kotlin
使用Timber打印一些信息
要使用Timber搭综,需要引入依賴,在dependencies中中添加以下依賴
implementation 'com.jakewharton.timber:timber:4.7.1'
具體版本號(hào)可依據(jù)github上最新的版本修改以下咽瓷。
使用如下:
Timber.i("onDestroy Called")
等效于
Log.i("你的activity","onDestroy Called")
使用Lifecycle
進(jìn)行生命周期管理
一些場景需要用到如計(jì)數(shù)器等需要生命周期管理的對(duì)象時(shí)设凹,在配套的 onStart 和 onStop 都要寫一些膠水代碼,如果需要管理很多類似的代碼時(shí)茅姜,則非常容易出錯(cuò)闪朱。此時(shí)Lifecycle
將非常便捷
如下:
class DessertTimer(lifecycle: Lifecycle) : LifecycleObserver {
// The number of seconds counted since the timer started
var secondsCount = 0
/**
* [Handler] is a class meant to process a queue of messages (known as [android.os.Message]s)
* or actions (known as [Runnable]s)
*/
private var handler = Handler()
private lateinit var runnable: Runnable
init {
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun startTimer() {
// Create the runnable action, which prints out a log and increments the seconds counter
runnable = Runnable {
secondsCount++
Timber.i("Timer is at : $secondsCount")
// postDelayed re-adds the action to the queue of actions the Handler is cycling
// through. The delayMillis param tells the handler to run the runnable in
// 1 second (1000ms)
handler.postDelayed(runnable, 1000)
}
// This is what initially starts the timer
handler.postDelayed(runnable, 1000)
// Note that the Thread the handler runs on is determined by a class called Looper.
// In this case, no looper is defined, and it defaults to the main or UI thread.
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stopTimer() {
// Removes all pending posts of runnable from the handler's queue, effectively stopping the
// timer
handler.removeCallbacks(runnable)
}
}
比較好用的一個(gè)快捷鍵
多行相同的內(nèi)容同時(shí)編輯時(shí)如下:
AS: control + G
VS: command + shift + L
VS: option + shift + ↓ 為快速復(fù)制快捷鍵