Please enable JavaScript.
Coggle requires JavaScript to display documents.
Kotlin Programming language (Các kiểu dữ liệu/cú pháp cơ bản (Các kiểu dữ…
Kotlin Programming language
Các kiểu dữ liệu/cú pháp cơ bản
Các kiểu dữ liệu
Kiểu Int,Double,... thêm _ cho dễ đọc:
"?" là nullable object:
So sánh 2 object "cùng kiểu, cùng giá trị":
Cụ thể:
Chỉ so sánh giá trị, dùng==
Ép kiểu từ nhỏ->to = implicit casting
Ko ép được(khác với Java)
Muốn ép kiểu phải dùng toTenKieu():
val = value = "const"
var = variable
Sử dụng apply, đỡ phải kiểm tra null
Sẽ được viết thành:
Không thích "apply" có thể dùng "with":
Dùng width đẹp hơn hẳn:
Không thích "apply", có thể dùng "let":
Kết quả:
Kiểu mảng, giống List trong Java:
Kiểu immutable, ko thêm/xoá được phần tử
Khởi tạo với size và lambda function:
Ko cần gọi get/get như Java:
Mảng chỉ chứa các giá trị nguyên thuỷ(primitive):
Kết quả:
Ngoài ra có thêm ByteArray, ShortArray, IntArray,...
ArrayList các object: ArrayList là 1 "Generics Class"
Tạo mảng và thêm các phần tử:
Duyệt danh sách, chú ý thêm "run":
Xoá một object dùng filter(chú ý type casting):
Update một object, rất đơn giản:
Kiểu key-value - MutableMap:
Có thể sử dụng các hàm put, get giống như java !
Các syntax cơ bản
if, else, for, loop
Biểu thức dạng "ternary":
Kiểm tra "NOT IN":
switch case = when
Hãy coi mỗi case như 1"biểu thức lambda":
Nếu các case là 1 "range":
Cú pháp gần ngôn ngữ tự nhiên:
for..loop, duyệt danh sách:
Kết quả:
Duyệt mảng với for...in:
Kết quả:
for...in với "tuple":
Có thể duyệt bằng for...each:
Chú ý chữ "run" !
Nếu phần thực thi có 1 dòng:
Functions = Hàm
Hàm nặc danh(không tên) = Anonymous function:
Gọi ra như hàm thông thường:
Lớp(class) và đối tượng(object)
Mọi object đều là con của Any!
Định nghĩa class:
Hàm khởi tạo(constructor)
Hàm "second" constructor "kế thừa" primary constructor:
employees là thuộc tính "public"
Khởi tạo đối tượng dùng hàm "second" constructor:
employees là "public" nên show ra được:
Khối initialization block luôn chạy trước tiên:
Hàm primary constructor(chú ý val, var, nếu ko object sẽ ko nhìn thấy properties)
Thông tin object:
Khởi tạo đối tượng dùng "primary" constructor:
Không có "new" !
Thuộc tính(properties)
Getter/setter tự generate, ko bắt buộc phải viết:
Gọi getter/setter:
Nếu ko thực thi 2 hàm primary/secondary constructor =>
Hàm primary mặc định sẽ tự sinh ra
Singleton Pattern ?
Một class chỉ tạo ra 1 đối tượng:
Khi gọi method trong singleton object chỉ cần:
Thuộc tính(properties) phải khởi tạo !
Nếu ko khởi tạo thì class&props phải là abstract:
Mỗi thuộc tính đều có access/visibility modifiers:
public(mặc định): Cho phép truy cập từ đối tượng ngoài,
private: Chỉ cho phép truy cập trong 1 file .kt hoặc 1 class
protected: chỉ "public" trong phạm vi class hiện tại và class con(subclass) của lớp này
internal: "public bên trong 1 module(package)"
Interface, có thể chứa thuộc tính và phương thức:
Một class có thể thực thi nhiều interface:
Default method ko cần thực thi:
Phương thức abstract ko cần thực thi:
Lớp con(non-abstract) có trách nhiệm thực thi:
Chỉ có thể khởi tạo object từ non-abstract class:
Phương thức static = companion object
Gọi phương thức static từ "tên class":
Thuộc tính static cũng tương tự:
Gọi ra cũng bằng tên class:
Data class:
Có chứa sẵn các phương thức equals, copy, hashcode(),...
Data class ko thể là:
open, abstract, inner, sealed
Gọi như thường:
Nhân bản(copy) đối tượng như thường:
Trích xuất(destructuring) các thuộc tính của 1 đối tượng(chỉ dùng cho data class):
Kết quả:
Kế thừa(Inheritance)
Lớp cha = base/parent class
open = overridable = inheritable
Lớp cha là open , chứa open method
=> lớp con có thể thực thi lại
Thêm final nếu ko muốn lớp con override:
Muốn thêm method và một class sẵn có mà ko cần kế thừa => Extension
VD: muốn thêm hàm becomeUpper vào lớp String của Kotlin:
Gọi ra đơn giản:
Kết quả:
Override hàm primary constructor:
Lớp con(Derived) có thêm propB:
Override hàm secondary constructor:
Ở phía lớp con(Derived class):
Lập trình Android với Kotlin
Android Programming with Kotlin
Tất cả các màn hình kế thừa từ class Activity
Tóm tắt LifeCycle:
Lần đầu chạy App: onCreate -> onStart -> onResume
Ấn Home: onPause -> onStop
User mở app: onStart -> onResume
User thoát app: onPause, onStop
User hiện màn hình 2: onPause -> onStop
Activity = màn hình
Ánh xạ class với file xml:
File xml:
Khai báo thuộc tính trong xml:
Sẽ tự động ánh xạ:
Truyền dữ liệu và object giữa 2 màn hình(Intent):
class User phải thực thi interface Serializable !
Màn hình nhận:
Intent sẵn có. VD:Lấy ảnh từ gallery:
Sau khi chọn ảnh xong, tự nhảy vào đây(trong class Activity):
Layouts
Linear layout: "hộp" phân bố theo chiều dọc/ngang
Ví dụ 1:
Tạo LinearLayout phân bố theo chiều ngang:
Button bên trong có trọng lượng như nhau:
Nút login:
Khoảng trống giữa 2 nút:
RecyclerView: Hiện danh sách(List):
Ban đầu phải khai báo adapter
Mặc định là adapter kiểu dọc(Vertical)=> nhớ khởi tạo adapter
Nếu muốn kiểu ngang thì thay đổi trong LinearLayoutManager
Adapter luôn gắn liền với "data list":
Adapter là nơi kết nối giữa Data và UI, cần thực thi các phương thức trong interface Adapter
getItemViewType => method này tính lại giá trị của viewType:
ListItem lấy UI từ đâu ?
Một RecyclerView nhận nhiều kiểu ListITem khác nhau ?
Nội dung của ListItem là gì?
RecyclerView có mấy Item?
PersonViewItem cập nhập UI trong setter:
Person đơn giản là 1 "Model":
Muốn RecyclerView dạng Grid:
Set số cột của GridView:
Gọi API với okHTTP và Retrofit
Gọi API GET/POST
Upload ảnh lên Server
3 Method quan trọng
application/x-www-form-urlencoded
Gói lại thành "query string": x=1&b=2
multipart/form-data
Chia nhỏ object thành từng phần rồi gửi lên server
Mỗi phần đều có Content-Type, Content-Length
Cài đặt thư viện trong gradle:
retrofit, converter-gson
Một số object cần thiết: retrofit, base url:
Để upload phải có đường dẫn đến file ảnh:
Thực chất là biến uri sang đường dẫn(path)
Tạo ra các object inputs trước khi gửi request lên Server
1 more item...
Định nghĩa hàm gửi Request, ko cần phần thực thi:
text-plain: Chuyển hết thành text
Ko nên dùng
Name: Nguyen Duc Hoang
Youtube:
https://www.youtube.com/c/nguyenduchoang