Mới đây, tại Google I/O 2017. Google đã chính thức hỗ trợ ngôn ngữ lập trình Kotlin, bên cạnh Java và C++ trong việc phát triển các ứng dụng Android.

Kotlin là một ngôn ngữ kiểu tĩnh dành cho Java Virtual Machine đã chính thức phát hành phiên bản 1.1.3-2 (tại thời điểm viết bài). Nó được tạo ra bởi JetBrains, Kotlin cũng giống như nhiều ngôn ngữ lập trình không phải Java khác, tức là cũng sẽ chạy trên JVM và sử dụng các công cụ và thư viện hiện có của Java. Và ngược lại Java cũng có thể sử dụng các item được xây dựng trong Kotlin.

  • Nó 100% có thể hoán đổi với Java, đối với nơi mà bạn có thể tiếp tục sử dụng các thư viện sẵn có và các framework của Java, và thậm chí có thể sử dụng kết hợp Java và Kotlin trong dự án Android của bạn.
  • Cú pháp của nó được thiết kế để giống với Java, có nghĩa là nó sẽ khá dễ dàng cho các nhà phát triển Java để hiểu nguyên tắc cơ bản của Kotlin.
  • Nó kết hợp các tính năng và các khái niệm từ lập trình thủ tục và hàm.
  • Nó cũng được hỗ trợ tốt bởi Android Studio.
  • An toàn, tránh toàn bộ các lớp lỗi như các null pointer exceptions
  • Nhỏ gọn để giảm số lượng mã boilerplate cần viết.
  • Mã code dễ đọc và dễ hiểu hơn.

Trong hướng dẫn này, chúng ta bắt đầu với một số phát triển Kotlin thực tế. Phần cuối cuối của hướng dẫn, bạn sẽ tạo ra một ứng dụng Android đơn giản sẽ hiển thị một dòng văn bản—và được viết hoàn toàn bằng Kotlin. Bạn cũng sẽ biết cách để khỏi phải viết findViewById nữa, bằng cách sử dụng các extension Android của Kotlin.

Nhưng trước tiên, chúng ta cần thiết lập môi trường phát triển để nó có thể nói một ngôn ngữ mới!

Cài đặt Plugin Kotlin trong Android Studio

Điều đầu tiên bạn cần làm là thêm hỗ trợ Kotlin cho bản cài đặt Android Studio của bạn, nếu bạn đang sử dụng phiên bản Android Studio 2.3.2. Hiện tại trên phiên bản 3.0 Preview thì Google đã tích hợp khá xâu Kotlin vào trong Android Studio, nên nếu bạn đang sử dụng bản 3.0 thì có thể bỏ qua bước này.

Trước khi chúng ta bắt đầu, hãy chắc chắn rằng bạn đang chạy phiên bản mới nhất, phiên bản ổn định của Android Studio, vì bạn có thể gặp vấn đề với plugin Kotlin trên các phiên bản thử nghiệm của Android Studio. Cũng cần mở SDK Manager và kiểm tra xem bản có cập nhật cho bất kỳ gói nào bạn đã cài đặt hay không.

Khi bạn tự tin rằng môi trường phát triển của bạn đã được cập nhật, thì bạn đã sẵn sàng để cài đặt plugin Kotlin. Khởi động Android Studio và bạn sẽ thấy cửa sổ Welcome to Android Studio

Nhấp vào biểu tượng Configure, và sau đó chọn Plugins từ trình đơn thả xuống tiếp theo.

Nhấp vào nút Install JetBrains plugins...

Chọn Kotlin từ trình đơn, và sau đó nhấp vào nút Install màu xanh lá cây. Bạn sẽ cần phải khởi động lại IDE của bạn trước khi plugin Kotlin được kích hoạt, do đó, hoặc nhấp vào nút Restart Android Studio hoặc khởi động lại IDE của bạn theo cách thủ công.

Cấu hình dự án của bạn để sử dụng Kotlin

Tại thời điểm này, IDE của bạn có thể hiểu và chạy code Kotlin, nhưng bạn vẫn sẽ cần phải cấu hình Kotlin mỗi khi bạn muốn sử dụng nó trong một dự án mới. Hãy tạo một dự án mới và cấu hình dự án sử dụng Kotlin ngay bây giờ. Tạo một dự án mới với các cài đặt của bạn, nhưng để đơn giản, chọn Empty Activity khi được nhắc.

Nhờ plugin Kotlin, cấu hình một dự án sử dụng Kotlin cực kỳ đơn giản: chỉ cần chọn Tools từ thanh công cụ Android Studio, tiếp theo là Kotlin và Configure Kotlin in Project.

 

Điều này sẽ mở một popup nơi bạn có thể chọn cấu hình Kotlin cho:

  • tất cả các mô-đun
  • hoặc một mô-đun duy nhất, được đặt tên

Bởi vì tôi sẽ chỉ sử dụng code Kotlin trong dự án của tôi, nên tôi đã lựa chọn All modules. Bạn cũng có thể lựa chọn phiên bản Kotlin mà bạn muốn sử dụng—thông thường, đây sẽ là phiên bản mới nhất.

 

Ngoài ra, bạn có thể cấu hình Kotlin bằng cách chọn Help từ thanh menu của Android Studio, sau đó là tìm đến Find Action… Trong thanh Find Action, gõ Configure Kotlin in Project, và sau đó chọn tùy chọn này khi nó xuất hiện.

Tuỳ chọn Configure Kotlin in Project tạo ra một số tinh chỉnh cho các tập tin build.gradle của dự án, vì vậy, hãy tìm hiểu kỹ hơn về những thay đổi trong những tập tin này. Mở tập tin build.gradle ở cấp độ project—nó sẽ trông giống như thế này

Và xem build.gradle ở cấp độ mô-đun

Cuối cùng, đồng bộ các thay đổi bằng cách nhấp vào Sync Now từ popup xuất hiện hoặc bằng cách nhấn vào biểu tượng Sync Project with Gradle Files trong thanh công cụ của Android Studio.

Chuyển đổi tập tin Java thành Kotlin

Một tính năng của plugin Kotlin đặc biệt hữu ích cho người mới đến với Kotlin đó là khả năng chuyển đổi bất kỳ tập tin mã nguồn Java nào thành Kotlin, trong khi duy vẫn trì khả năng tương thích đầy đủ khi chạy runtime.

Biết chính xác cách làm thế nào để bất kỳ tập tin trong Java sẽ được dịch thành Kotlin là điều lý tưởng để giúp bạn tìm hiểu ngôn ngữ, nhưng nó còn có thể có ích trong suốt hành trình với Kotlin của bạn—nếu bạn đã bao giờ gặp khó khăn khi viết một cái gì đó trong Kotlin, bạn có thể luôn luôn viết bằng Java và sau đó sử dụng tính năng này để chuyển đổi mã đó thành Kotlin.

Hãy chuyển đổi tập tin MainActivity của dự án thành một tập tin nguồn Kotlin. Có hai cách để gọi action Convert Java File to Kotlin File của plugin Kotlin, một trong hai cách đó là:

  • Chọn tập tin MainActivity của bạn, và sau đó chọn Code từ thanh menu của Android Studio, tiếp theo chọn Convert Java File to Kotlin File.

 

  • Hoặc chọn Help từ thanh menu của Android Studio, sau đó là Find Action. Trong popup tiếp theo, gõ Convert Java file to Kotlin file và sau đó chọn tùy chọn này khi nó xuất hiện. Lưu ý, bạn cũng có thể khởi động popup Find Action với một phím tắt: nếu bạn đang trên một máy Mac, nhấn Command-Shift-A, và nếu bạn đang trên Windows hoặc Linux, thì nhấn Control-Shift-A.

Chỉ cần lưu ý rằng, tùy thuộc vào sự phức tạp của code mà bạn viết, việc chuyển đổi có thể không phải lúc nào cũng chính xác 100%, do đó, bạn nên luôn luôn kiểm tra lỗi cho code của bạn sau khi đã được chuyển đổi.

MainActivity vừa được chuyển đổi của bạn sẽ giống như hình dưới:

 

Hiểu cú pháp của Kotlin

Trong Kotlin, bạn khai báo các lớp bằng cách sử dụng từ khoá class giống hệt trong Java. Tuy nhiên, trong Kotlin, các lớp (và phương thức) mặc định là public và final, vì vậy bạn có thể tạo ra một lớp đơn giản chỉ bằng cách viết class MainActivity.

Khi nói đến việc thừa kế một lớp, bạn thay thế extends của Java bằng một dấu hai chấm, và sau đó đính kèm tên của lớp cha. Vì vậy, trong dòng đầu tiên của tập tin MainActivity.kt, chúng ta đang tạo ra một lớp public, final được gọi là MainActivity thừa kế AppCompatActivity:

1

class MainActivity : AppCompatActivity() {

....

}

Tương tự với Java sẽ là:

1

public class MainActivity extends AppCompatActivity {

...

}

Nếu bạn muốn override một lớp hoặc phương thức, thì bạn sẽ cần phải khai báo rõ ràng nó là open hay abstract.

Trong Kotlin, hàm được định nghĩa bằng cách sử dụng từ khóa fun, theo sau là tên hàm và tham số trong ngoặc đơn. Trong Kotlin, tên hàm ở phía trước kiểu của nó:

1

override fun onCreate(savedInstanceState: Bundle?) {

...

}

Điều này ngược lại với Java, trong đó kiểu ở trước tên:

1

public void onCreate(Bundle savedInstanceState){

...

}

Lưu ý rằng chúng ta đã không chỉ định phương thức này là final, vì trong Kotlin tất cả các phương thức mặc định là final.

Phần còn lại của Acivity này trông khá giống với Java. Tuy nhiên, vài dòng này minh họa một đặc trưng quan trọng khác của Kotlin:

1

2

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

Ở Kotlin, bạn không cần phải hoàn tất dòng code của bạn bằng dấu chấm phẩy, vì thế không có dấu chấm phẩy trong đoạn code ở trên. Bạn có thể thêm dấu chấm phẩy, nếu bạn thực sự muốn, nhưng cde của bạn sẽ rõ ràng hơn và dễ dàng hơn để đọc khi không có chúng.

Bây giờ thì chúng ta đã giải mã tập tin MainActivity.kt của chúng ta, hãy di chuyển nó đến nơi thích hợp của nó. Vì plugin Kotlin gặp trục trặc khi thêm một khai báo src/main/kotlin vào tập tin build.gradle, nên chúng ta hãy tạo ra thư mục này. Bước này là không bắt buộc, nhưng giữ tập tin Kotlin của bạn trong một thư mục dành riêng sẽ làm cho dự án gọn gàng hơn nhiều.

Ở trong thanh Explorer Project của Android Studio, giữ Control và nhấp vào thư mục Main của dự án và chọn New từ menu xuất hiện, sau đó chọn Directory. Đặt tên thư mục này là kotlin và sau đó nhấp vào OK.

Tạo các class Kotlin phụ

Nếu bạn tiếp tục làm việc với Kotlin trong dự án của bạn, thì sớm hay muộn bạn sẽ cần bắt đầu tạo mới các tập tin Kotlin chứ không phải chỉ đơn giản là chuyển đổi tập tin Java hiện có.

Để tạo một class Kotlin, nhấn chuột phải vào tên package và chọn New > Kotlin File/Class.

Sau đó, bạn sẽ cần phải chỉ định lớp mà bạn đang thừa kế, sử dụng cùng một lớp mà chúng ta đã thấy trong tập tin MainActivity.kt 

Tiếp theo, ta cần override phương thức onCreate của Activity

Extension Kotlin cho Android: Nói tạm biệt với findViewById

Bây giờ thì chúng ta đã nắm rõ các khái niệm cơ bản, chúng ta hãy tìm hiểu sâu hơn về Kotlin thực sự có khả năng làm được những gì—bắt đầu với một tính năng mà thực sự có thể cắt giảm số lượng code bạn cần phải viết.

Trong Android, mỗi khi bạn muốn làm việc với bất kỳ View nào trong một Activity, bạn cần phải sử dụng phương thức findViewById để có được một tham chiếu đến View đó. Điều này làm cho findViewById trở thành một trong những thứ quan trọng nhất, nhưng cũng là một chút gì đó bực bội nhất là khi bạn sẽ thấy mình phải viết đi viết lại trong dự án Android của bạn. Phương thức findViewById chứa nhiều lỗi tiềm tàng, và nếu bạn đang làm việc với nhiều thành phần UI trong cùng một Activity, thì tất cả những findViewByIdcó thể thực sự làm xáo xộn code của bạn, làm cho nó khó khăn để đọc.

Mặc dù có một số thư viện, như Butter Knife, nhằm loại bỏ findViewById, nhưng các thư viện này vẫn còn yêu cầu bạn phải chú thích các trường cho mỗi View, mà có thể dẫn đến những sai sót và vẫn cảm thấy như cần rất nhiều công sức.

Các extension cho Kotlin trong Android (mà gần đây đã được tích hợp vào plugin Kotlin tiêu chuẩn) hứa hẹn sẽ biến findViewById thành quá khứ, cung cấp cho bạn những lợi ích của các thư viện nói trên mà không có nhược điểm là phải viết bất kỳ code bổ sung hoặc mất thời gian để chạy runtime.

Bạn có thể sử dụng các extension Kotlin để nhập các tham chiếu View vào tập tin mã nguồn của bạn. Tại thời điểm này plugin Kotlin sẽ tạo ra một bộ "các thuộc tính tổng hợp" cho phép bạn làm việc với những View này như chúng là một phần của Activity của bạn—chủ yếu, điều này có nghĩa là bạn không còn sử dụng findViewById để xác định vị trí mỗi View trước khi bạn có thể làm việc với nó.

Để sử dụng các extension, bạn sẽ cần phải kích hoạt plugin Kotlin Android Extensions trong mỗi mô-đun, vì vậy hãy mở tập tin build.gradle nằm ở cấp mô-đun của bạn và thêm những thứ sau đây:

1

apply plugin: 'kotlin-android-extensions'

Đồng bộ các thay đổi này bằng cách nhấp vào popup Sync Now.

Sau đó, bạn có thể nhập các tham chiếu đến một View, bằng cách sử dụng định dạng sau:

1

import kotlinx.android.synthetic.main.<layout>.<view-id>

Ví dụ, nếu tập tin acitivity_main.xml của bạn chứa một TextView với ID text, thì bạn cần nhập tham chiếu đến View bằng cách thêm những thứ sau đây vào Activity của bạn:

1

import kotlinx.android.synthetic.main.activity_main.text

Sau đó, bạn sẽ có thể truy xuất text bên trong activity này bằng cách sử dụng ID của nó—và không cần quan tâm đến findViewById!

Chúng ta hãy tìm hiểu các extension bằng ví dụ, bằng cách thêm một TextView vào tập tin activity_main.xml của chúng ta, nhập nó vào tập tin MainActivity.kt, và bằng cách sử dụng các extension để thiết lập văn bản cho TextView.

Bắt đầu bằng cách tạo ra TextView của bạn:

Sau đó bạn có thể nhập TextView vào MainActivity.kt, và thiết lập văn bản của nó bằng cách chỉ sử dụng ID của nó

Lưu ý, nếu bạn muốn làm việc với nhiều widget từ cùng một layout, thì bạn có thể nhập toàn bộ nội dung của tập tin layout một lần, bằng cách sử dụng công thức sau:

1

import kotlinx.android.synthetic.main.<layout>.*

Ví dụ, nếu bạn muốn nhập tất cả các widget từ tập tin activity_main.xml của bạn, thì bạn sẽ thêm những thứ sau đây vào Activity của bạn:

1

kotlinx.android.synthetic.main.activity_main.*.

References