將 Kotlin 新增至現有應用程式

Android Studio 提供對 Kotlin 的全面支援,可讓您將 Kotlin 檔案新增至現有專案,並將 Java 語言程式碼轉換為 Kotlin。您可以將 Android Studio 現有的全部工具與 Kotlin 程式碼搭配使用,包括自動完成、lint 檢查、重構、偵錯等。

如要開始新的專案,並希望使用 Kotlin,請參閱「建立專案」一文。

如需查看範例,請參閱 Kotlin 程式碼範例

將 Kotlin 新增至現有專案

如要在專案中加入 Kotlin,請按照下列指示操作:

  1. 點選「File」(檔案) >「New」(新增),然後選擇其中一個 Android 範本,例如新的空白「片段」,如圖 1 所示。如果在此選單中找不到範本清單,請先開啟「Project」(專案) 視窗,然後選取應用程式模組。

    建立新的空白片段
    圖 1. 從可用的範本中選擇,例如片段或活動。
  2. 在顯示的精靈中,於「Source Language」(來源語言) 選擇「Kotlin」。圖 2 顯示建立新活動時出現的「New Android Activity」(新 Android 活動) 對話方塊。

    對話方塊,用於為來源語言選擇 Kotlin
    圖 2. 「New Android Activity」(新 Android 活動) 對話方塊可讓您將「Kotlin」選為「來源語言」
  3. 在精靈中繼續設定。

您也可以點選「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。

這個對話方塊顯示了提示訊息,要求您為自己的專案設定 Kotlin
圖 3. 如果沒有為專案設定 Kotlin,Android Studio 會顯示警示對話方塊。

當系統出現提示時,選擇「All modules containing Kotlin files」(所有包含 Kotlin 檔案的模組) 以設定 Kotlin,如圖 4 所示:

選擇所有包含 Kotlin 程式碼的模組來設定 Kotlin。
圖 4. 選擇所有包含 Kotlin 程式碼的模組來設定 Kotlin。

點選「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」(下次不顯示此對話方塊),日後系統即會自動進行轉換。

選擇所有包含 Kotlin 程式碼的模組來設定 Kotlin。
圖 5. Android Studio 可以將 Java 程式碼轉換為 Kotlin。

程式碼轉換和是否可為空值

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」。