Android Studio 提供對 Kotlin 的全面支援,可讓您將 Kotlin 檔案新增至現有專案,並將 Java 語言程式碼轉換為 Kotlin。您可以將 Android Studio 現有的全部工具與 Kotlin 程式碼搭配使用,包括自動完成、lint 檢查、重構、偵錯等。
如要開始新的專案,並希望使用 Kotlin,請參閱「建立專案」一文。
如需查看範例,請參閱 Kotlin 程式碼範例。
將 Kotlin 新增至現有專案
如要在專案中加入 Kotlin,請按照下列指示操作:
點選「File」(檔案) >「New」(新增),然後選擇其中一個 Android 範本,例如新的空白「片段」,如圖 1 所示。如果在此選單中找不到範本清單,請先開啟「Project」(專案) 視窗,然後選取應用程式模組。
在顯示的精靈中,於「Source Language」(來源語言) 選擇「Kotlin」。圖 2 顯示建立新活動時出現的「New Android Activity」(新 Android 活動) 對話方塊。
在精靈中繼續設定。
您也可以點選「File」(檔案) >「New」(新增) > 「Kotlin File/Class」(Kotlin 檔案/類別) 以建立基本 Kotlin 檔案。如果沒有看到這個選項,請開啟「Project」(專案)視窗,然後選取「java」目錄。「New Kotlin File/Class」(新 Kotlin 檔案/類別) 視窗可讓您定義檔案名稱,並為檔案類型提供多個選項:「檔案」、「類別」、「介面」、「列舉類別」或「物件」。您的選擇會決定在新的 Kotlin 檔案中建立的基本鷹架。如果您選擇「類別」,Android Studio 就會以指定的名稱及相符的類別定義,建立新的 Kotlin 來源檔案。如果您選擇「介面」,系統會在檔案中宣告介面,以此類推。
如果這是您第一次將新的 Kotlin 類別或檔案直接新增至專案 (未使用 Android 範本),Android Studio 會顯示一條警示,說明專案中並未設定 Kotlin 專案,如圖 3 所示。點選編輯器右上角的「Configure」,或點選右下角彈出的事件記錄快訊對話方塊,即可設定 Kotlin。
當系統出現提示時,選擇「All modules containing Kotlin files」(所有包含 Kotlin 檔案的模組) 以設定 Kotlin,如圖 4 所示:
點選「OK」(確定) 後,Android Studio 會將 Kotlin 新增至您的專案類別路徑中,然後將 Kotlin Android 外掛程式套用至每個包含 Kotlin 檔案的模組。您的 build.gradle
檔案應與以下範例類似:
Groovy
// Project build.gradle file. buildscript { ext.kotlin_version = '1.4.10' ... dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }
Kotlin
// Project build.gradle.kts file. buildscript { extra["kotlin_version"] = "1.4.10" ... dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") } }
Groovy
// Inside each module using kotlin plugins { ... id 'kotlin-android' } ... dependencies { implementation 'androidx.core:core-ktx:1.3.2' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" }
Kotlin
// Inside each module using kotlin plugins { ... kotlin("android") } ... val kotlin_version: String by rootProject.extra dependencies { implementation("androidx.core:core-ktx:1.3.2") implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") }
原始碼的整理方式
根據預設,新的 Kotlin 檔案會儲存在 src/main/java/
中,方便您集中查看 Kotlin 和 Java 檔案。如要將 Kotlin 檔案與 Java 檔案分開,您可以把 Kotlin 檔案放在 src/main/kotlin/
之下。如果採取這種做法,您也需要在 sourceSets
設定中加入這個目錄,如下所示:
Groovy
android { sourceSets { main.java.srcDirs += 'src/main/kotlin' } }
Kotlin
android { sourceSets { getByName("main") { java.srcDir("src/main/kotlin") } } }
將現有 Java 程式碼轉換為 Kotlin 程式碼
如要將 Java 程式碼轉換為 Kotlin,請在 Android Studio 中開啟 Java 檔案,然後依序選取「Code」(程式碼) >「Convert Java File to Kotlin File」(將 Java 檔案轉換為 Kotlin 檔案)。您也可以建立新的 Kotlin 檔案 (「File」(檔案) >「New」(新增) >「Kotlin File/Class」(Kotlin 檔案/類別)),然後將 Java 程式碼貼到該檔案中。接著,Android Studio 會顯示提示,並自動將程式碼轉換為 Kotlin,如圖 5 所示。點選「Yes」(是) 以進行轉換。您可以勾選「Don't show this dialog next time」(下次不顯示此對話方塊),日後系統即會自動進行轉換。
程式碼轉換和是否可為空值
Android Studio 的轉換程序會產生具有同等編譯和執行功能的 Kotlin 程式碼。不過,您可能需要對轉換的程式碼進行額外的最佳化調整。例如,您可能想修正已轉換的程式碼處理可為空值類型的方式。
在 Android 中,如果 View
物件和其他元件所依附的片段或活動未達到適當的生命週期狀態,系統通常會延遲對這些物件和元件進行初始化調整。例如,您可以在其中一個片段內參照某個按鈕,如以下程式碼片段所示:
public class JavaFragment extends Fragment {
// Null until onCreateView.
private Button button;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_content, container,false);
// Get a reference to the button in the view, only after the root view is inflated.
button = root.findViewById(R.id.button);
return root;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Not null at this point of time when onViewCreated runs
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
});
}
}
即使按鈕變數為可為空值,但在這個範例中,為執行各種實際用途,請勿將這個變數設為空值。不過,由於未在建構時指派該變數的值,所以產生的 Kotlin 程式碼會將 Button
視為可為空值類型,並在新增點擊次數事件監聽器時,使用非空值的斷言運算子來為按鈕解除包裝,如下所示:
class JavaFragment : Fragment() {
// Null until onCreateView.
private var button: Button? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
...
// Get a reference to the button in the view, only after the root view is inflated.
button = root.findViewById(R.id.button)
...
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Not null at the point of time when onViewCreated fires
// but force unwrapped nonetheless
button!!.setOnClickListener { }
}
}
在此情況下,這樣轉換的效果不如 lateinit
,因為您必須在每個存取位置使用非空值斷言或安全呼叫運算子,為按鈕參照解除包裝。
在其他情況下,如果 null
是根據應用程式用途產生的有效變數指派,使用安全呼叫 (?.) 運算子和終止 elvis 運算子 (?:) 運算子,可能是一種更適當的做法,能為可為空值物件解除包裝,或強制轉換為合理的非空值預設值。Android Studio 提供的資訊不足以在轉換過程中做出判斷。雖然根據預設,此是非空值斷言,但請視需要跟進和調整已轉換的程式碼。
更多資訊
如要進一步瞭解如何在專案中使用 Kotlin 和 Java 程式碼,請參閱「從 Kotlin 呼叫 Java 程式碼」。
如要進一步瞭解如何在企業情境中使用 Kotlin,請參閱「為大型團隊採用 Kotlin」。
如要進一步瞭解現有 Android API 的慣用 Kotlin 包裝函式,請參閱「Android KTX」。