Friday, February 26, 2021

Tìm hiều View binding trong Android

View binding là một tính năng cho phép bạn viết mã tương tác với dạng xem dễ dàng hơn. Khi tính năng liên kết dạng xem được kích hoạt trong một mô-đun, nó tạo ra một lớp liên kết cho mỗi tệp bố cục XML có trong mô-đun đó. Một thể hiện của lớp liên kết chứa các tham chiếu trực tiếp đến tất cả các dạng xem có ID trong bố cục tương ứng.

Trong hầu hết các trường hợp, ràng buộc chế độ xem thay thế findViewById.


Hướng dẫn cài đặt.

View binding trong Android được xem như là một liên kết chế độ xem được bật trên cơ sở từng mô-đun. Để bật liên kết chế độ xem trong một mô-đun, hãy đặt tùy chọn xây dựng viewBinding thành true trong tệp build.gradle cấp mô-đun, như được hiển thị trong ví dụ sau:
android {
    ...
    buildFeatures {
        viewBinding true
    }
}

Nếu bạn muốn tệp bố cục bị bỏ qua khi tạo các lớp liên kết, hãy thêm thuộc tính tools: viewBindingIgnore = "true" vào chế độ xem gốc của tệp bố cục đó: 

<LinearLayout

        ...

        tools:viewBindingIgnore="true" >

    ...

</LinearLayout>


Hướng dẫn sử dụng

Nếu tính năng liên kết dạng xem được bật cho một mô-đun, thì một lớp liên kết sẽ được tạo cho mỗi tệp bố cục XML mà mô-đun đó chứa. Mỗi lớp liên kết chứa các tham chiếu đến chế độ xem gốc và tất cả các chế độ xem có ID. Tên của lớp ràng buộc được tạo ra bằng cách chuyển đổi tên của tệp XML thành kiểu chữ Pascal và thêm từ "Binding" vào cuối.

Ví dụ: đã cung cấp một tệp bố cục có tên là result_profile.xml:
<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>
Lớp ràng buộc được tạo ra được gọi là ResultProfileBinding. Lớp này có hai trường: một TextView được gọi là tên và một nút được gọi là nút. ImageView trong layout không có ID, vì vậy không có tham chiếu đến nó trong lớp ràng buộc.

Mọi lớp View binding cũng bao gồm một phương thức getRoot (), cung cấp một tham chiếu trực tiếp cho chế độ xem gốc của tệp bố cục tương ứng. Trong ví dụ này, phương thức getRoot () trong lớp ResultProfileBinding trả về dạng xem gốc LinearLayout.

Các phần sau đây trình bày việc sử dụng các lớp ràng buộc đã tạo trong các hoạt động và các phân đoạn.

Sử dụng View binding trong Activity

Để thiết lập một phiên bản của lớp liên kết để sử dụng với một hoạt động, hãy thực hiện các bước sau trong phương thức onCreate () của hoạt động:

Gọi phương thức static Inflate () có trong lớp ràng buộc đã tạo. Điều này tạo ra một thể hiện của lớp ràng buộc cho hoạt động sử dụng.
Nhận tham chiếu đến chế độ xem gốc bằng cách gọi phương thức getRoot () hoặc sử dụng cú pháp thuộc tính Kotlin.
Chuyển chế độ xem gốc đến setContentView () để làm cho nó trở thành chế độ xem hiện hoạt trên màn hình.
private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}
Có thể sử trong class
binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});


Sử dung view binding trong Fragment

 Để thiết lập một phiên bản của lớp liên kết để sử dụng với một phân đoạn, hãy thực hiện các bước sau trong phương thức onCreateView () của phân đoạn:

  • Gọi phương thức static Inflate () có trong lớp ràng buộc đã tạo. Điều này tạo ra một thể hiện của lớp ràng buộc để phân đoạn sử dụng.
  • Nhận tham chiếu đến chế độ xem gốc bằng cách gọi phương thức getRoot () hoặc sử dụng cú pháp thuộc tính Kotlin.
  • Trả lại chế độ xem gốc từ phương thức onCreateView () để làm cho nó trở thành chế độ xem hiện hoạt trên màn hình.

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater, 
                          ViewGroup container, 
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}
Trong function call view 
binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

 Sự khác biệt giữa viewBinding với findviewByid

View Binding có những lợi thế quan trọng so với việc sử dụng findViewById:

  • Null safety: Vì liên kết chế độ xem tạo ra các tham chiếu trực tiếp đến các chế độ xem, nên không có nguy cơ ngoại lệ con trỏ rỗng do ID chế độ xem không hợp lệ. Ngoài ra, khi một dạng xem chỉ xuất hiện trong một số cấu hình của bố cục, trường chứa tham chiếu của nó trong lớp liên kết được đánh dấu bằng @Nullable.
  • Type safety: Các trường trong mỗi lớp liên kết có kiểu phù hợp với các dạng xem mà chúng tham chiếu trong tệp XML. Điều này có nghĩa là không có nguy cơ xảy ra ngoại lệ của lớp.

Những khác biệt này có nghĩa là sự không tương thích giữa bố cục và mã của bạn sẽ dẫn đến việc xây dựng của bạn không thành công tại thời điểm biên dịch thay vì trong thời gian chạy.


No comments:

Post a Comment