若要在Android Wear Watch專案中能夠跑在實體手表時,都必須開啟Debug Mode來進行開發時的測試。
為此紀錄一下如何開啟Android Wear Watch的Debug模式:
首先你必須在手錶上的Settings > About > Build Number的選項,並對他進行7次點擊來開啟開發者模式。
之後回到Settings頁面時,下方會多出一個Developer Options,點選此項目來進行開發模式的設定如下:
開啟ADB debugging和Debug over Bluetooth這兩個選項,接著回到手機上的開發者模式,確認USB debugging為開啟的狀態,並開啟藍芽連線。
此時可以開啟手機內的Wear OS App,點選進階設定 > 開啟透過藍牙偵錯,一開始主機所顯示的是已中斷連線的狀態。
這時,將手機透過USB連接上電腦,並分別在Command Line下執行輸入這兩個命令:
adb forward tcp:4444 localabstract:/adb-hub
adb connect localhost:4444
此時你會看到Wear OS App中透過藍牙偵錯選項的主機狀態由已中斷連線切換為已連線。
最後可以看到手錶上會出現是否接受Debug模式的提示訊息,只需要點選OK即可完成Debug模式的開啟。
常常聽到許多人抱怨著存錢好難?
其實存錢並不難,而是需要選對方法,才能有效的儲蓄。國外廣為流傳的52週存錢法,其實就是一個很好的儲蓄方式!
什麼是階梯式存錢法?
1. 第一週,先存10元
2. 第二週以後,每週再比前一週多存10元
3. 52週後就能存下13,780元
在2018的2月,跟朋友討論到52週存錢法,覺得可以透過手機來紀錄自己的存錢目標,輕鬆地確認每週的存錢狀況,來取代以往使用紙本的條列式記帳。因此,開始著手製作52週存錢挑戰這個App,並給自己限時七日內完成的挑戰目標!
App發想:
透過First Time Flow來進行目標與週期的設定,模式與幣別選擇
透過Unsplash API來Random更換Background,提升畫面的質感
加入QuotesCard方式,來加強使用者繼續存錢的Motivation
加入HappyCard方式,來推廣使用者幫忙給予5星評論
持續增加中……
App功能特色:
App頁面:
// 語法結構
input -> bodyinput(parameters):
不輸入:()
單個輸入:x
多個輸入:(int x, int y)或簡寫(x,y)body:
什麼都不做:{}
單行不回傳值:print("NO")
多行不回傳值:
{
print("NO");
print("NO2");
}
單行回傳值:x+y
多行回傳值:
{
x++;
y-=x;
return x+y;
}
// Android
Runnable runnbale = new Runnable() {
public void run() {
System.out.println("run me!");
}
};// Lambda
Runnable runnbale = () -> System.out.println("run me!");
// Java
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
/* actions on click */
}
});// Lambda
button.setOnClickListener { view -> /* actions on click */ }
新觀念:以前必須自己實作所有東西的習慣,現在可以透過Lambda和相關的操作子來改正這習慣
//找出最大年齡fun findTheOldest(people: List<Person>) { var maxAge = 0 var theOldest: Person…
繼承類別
// 其他類別可以繼承這個類別
open class RichButton : Clickable {
// 這個函數是不可以被修改的(final),不可以在子類別中override它
fun disable() {} // 這個函數是可以被修改的(open),可以在子類別中override它
open fun animate() {} // 這函數override了一個已經open的函數,所以他也是可以被override的
ov …
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ", // 預設參數值
prefix: String = "",
postfix: String = ""
): String// 現在你可以使用以下方法來進行函數的調用
joinToString(list)
joinToString(list, ", ", "", "")
joinToString(list, ";")
joinToString(list, prefix = "#")
// Java
public class StringUtils {
public static String joinToString(...) { ... }
}// Kotlin
fun joinToString(...): String { ... }// 如果需要對這些function進行歸類時,可以使用改变文件的类名方式
@file:JvmName("StringFunctions")
package strings
fun joinToString(...): String { ... }// 呼叫時一樣需要進行import
import strings.StringFunctions
StringFunctions.joinToString(...)
// 在函數前添加需要擴展的類別或interface (receiver type)也就是接收型態
// 在後方的this則代表著擴展函數的值(receiver object)也就是接收物件fun String.lastChar(): Char = this.get(this.length - 1)// 此時的"Kotlin"同時為接收型態與接收物件print("Kotlin".lastChar())
輸出:n// 其實就有點像var text…
新觀念:盡可能地去使用val來作為宣告的變數,或函數中的參數,這樣可以幫助程式在使用變數時能更清楚了解哪些變數是可被改變,而透過編譯器來進行判斷
fun main(args: Array<String>) {
print(sayHello())
}fun sayHello(): String {
return "Hello, world!"
}fun …