ViewBinding - làm thế nào để có được ràng buộc cho bố cục bao gồm?


11

Trong khi làm việc với ViewBinding, tôi gặp một số trường hợp không được ghi lại.

Đầu tiên: Làm thế nào để có được ràng buộc cho các phần bố trí khung nhìn chung, ràng buộc chính chỉ xem các mục trong bố cục chính?

Thứ hai: Làm thế nào để có được ràng buộc cho các phần bố cục kiểu hợp nhất được bao gồm, một lần nữa ràng buộc chính chỉ nhìn thấy các mục trong bố cục chính?

Câu trả lời:


15

Trong trường hợp:

  1. Bao gồm với bố cục chung (không phải nút hợp nhất), chúng ta cần gán ID cho phần được bao gồm, theo cách này trong ràng buộc, chúng ta sẽ có quyền truy cập vào phần phụ được bao gồm
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

Cách này trong mã hoạt động của bạn:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. Bao gồm với khối hợp nhất trong bố trí bên ngoài. Chúng tôi không thể thêm ID vào nó vì khối hợp nhất không phải là chế độ xem. Giả sử chúng ta có bố cục hợp nhất vĩnh cửu như vậy (merge_layout.xm):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

Để liên kết đúng cách bố trí hợp nhất như vậy, chúng ta cần phải:

Trong mã hoạt động của bạn:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

1
Điều này có vẻ như một lỗi. Nó chỉ nên làm việc .
miguel

7

Câu hỏi đầu tiên của bạn, đó là làm việc với bố cục đi kèm bằng ViewBinding có thể được giải quyết dễ dàng.

Đây là một tệp main_fragment.xml mẫu

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</LinearLayout>

MainFragment.java có thể như thế này

public class MeaningFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

Bây giờ, bạn có hai ràng buộc. một trong số đó là mặc định và cái tiếp theo là từ bố cục đi kèm.


1
Câu trả lời rất đơn giản và sử dụng cú pháp mới - tất cả đều hoạt động với tôi trong Hoạt động không phân mảnh có cú pháp tương tự onCreate(). Cảm ơn. (Chỉ gặp một chút rắc rối khi sử dụng cho a DrawerLayout)
Fat Monk

0

Cách đơn giản khác sẽ là sử dụng thư viện liên kết dữ liệu. Sau đó bọc bố cục XML của bạn bằng thẻ để nếu bạn đang sử dụng thư viện sẽ tự động tạo các lớp cần thiết để liên kết các khung nhìn trong bố cục với các đối tượng dữ liệu của bạn. Thành thật mà nói, tôi nghĩ rằng đó là cách để đi. Thực hiện theo hướng dẫn tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.