2016-01-11 38 views
9

Có cách nào để sử dụng viewStub với dataBinding không? có thể giúp ViewStubProxy?Ràng buộc dữ liệu Android - cách sử dụng ViewStub với ràng buộc dữ liệu

còn sơ khai của tôi hiện nay trông như thế này:

<ViewStub 
    android:id="@+id/stub_import" 
    android:inflatedId="@+id/panel_import" 

    android:layout="@layout/progress_overlay" 

    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="@{myobject.bottom ? bottom:top}" /> 

Nhưng bố trí này sẽ được thay thế khi tôi thổi phồng các viewStub vậy làm thế nào ViewStubs có thể được sử dụng với databinding android?

đây là những gì tôi nhìn thấy từ docs:

ViewStubs

ViewStubs là một chút khác nhau khỏi Chế độ xem bình thường. Chúng bắt đầu tắt vô hình và khi chúng được hiển thị hoặc được thông báo rõ ràng để tăng cao, chúng thay thế chính chúng trong bố cục bằng cách tăng bố cục khác.

Vì ViewStub về cơ bản biến mất khỏi hệ thống phân cấp Chế độ xem, Chế độ xem trong đối tượng ràng buộc cũng phải biến mất để cho phép sưu tập . Vì Khung nhìn là cuối cùng, đối tượng ViewStubProxy mất vị trí của ViewStub, cho phép nhà phát triển truy cập vào ViewStub khi nó tồn tại và cũng có thể truy cập vào hệ thống phân cấp Chế độ xem tăng cao khi Chế độ xem bị thổi phồng.

Khi tăng bố cục khác, ràng buộc phải được thiết lập cho bố cục mới . Do đó, ViewStubProxy phải lắng nghe View2PViewStub.OnInflateListener của ViewStub và thiết lập ràng buộc tại thời điểm đó. Vì chỉ có thể tồn tại, ViewStubProxy cho phép nhà phát triển đặt OnInflateListener trên thiết bị mà nó sẽ gọi sau khi thiết lập liên kết .

Trả lời

11

Chỉ cần đặt người nghe như doc nói:

mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
     ViewStubBinding binding = DataBindingUtil.bind(inflated); 
     binding.setModel(model); 
    } 
}); 



public void inflateViewStub(View view) { 
    if (!mBinding.viewStub.isInflated()) { 
     mBinding.viewStub.getViewStub().inflate(); 
    } 
} 
+1

Là một lưu ý, 'ViewStubBinding 'không phải là một lớp, đó là lớp ràng buộc cho stub view. Phải mất một lúc tôi mới hiểu được điều đó; hy vọng, nhận xét này sẽ giúp người khác. – BlackHatSamurai

0

Đặt người nghe để có được quyền truy cập vào bố trí tăng cao sau khi lạm phát thành công của viewStub

mBinding.viewStub.setOnInflateListener(new OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
    ViewStubBinding binding = DataBindingUtil.bind(inflated); //call after succesful inflating of viewStub 
    // set data here 
    } 
}); 

Sau đó thổi phồng của bạn viewStub

mBinding.viewStub.getViewStub().inflate(); 
0

Khai báo vùng tên xml của bạn và chuyển biến qua đó. Điều này cũng làm việc với <include>, btw. Dưới đây là một ví dụ:

main_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:my-namespace="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="myData" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ViewStub 
      android:id="@+id/view_stub" 
      android:inflatedId="@+id/view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout="@layout/another_layout" 
      my-namespace:data="@{myData}" 
      /> 

    </RelativeLayout> 
</layout> 

another_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- No need to declare my-namespace here --> 
    <data> 
     <variable name="data" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{data.someValue}" /> 

    </RelativeLayout> 
</layout> 

Vì vậy, bây giờ bạn chỉ cần gọi inflate() và cách bố trí sẽ có dữ liệu. Bạn có thể kiểm tra lớp ràng buộc được tạo để xác minh điều này. Nó thậm chí có an toàn loại, vì vậy bạn không thể chuyển bất kỳ loại nào khác thành data.

0

Tôi cũng phải đối mặt với Loại sự cố này, cuối cùng tôi nhận được giải pháp và hoạt động hoàn hảo của nó.

ViewStub Tổ chức Layout ,,

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data class="MBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    -------------------- 
    -------------------- 
    <ViewStub 
    android:id="@+id/stub_import" 
    ------------------- 
    ------------------- 
     <ViewStub/> 
    -------------------- 
    -------------------- 
<layout/> 

bố trí bên trong ViewStub là ,,,

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data class="MViewStubLayoutBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    ---------------- 
    ---------------- 
    ---------------- 

đang Bên trong lớp là ,,,

public Class KKKKKK() { 
----------------- 
MBinding mBinding; 
MViewStubLayoutBinding mviewStubLayoutBinding; 

----------------------------- 
----------------------------- 

mBinding.stubImport.getViewStub().setLayoutResource(R.layout.progress_overlay); 

    mBinding.stubImport.setOnInflateListener(new ViewStub.OnInflateListener() { 
      @Override 
      public void onInflate(ViewStub viewStub, View view) { 
       mviewStubLayoutBinding=DataBindingUtil.bind(view); 
      } 
     }); 

     autoCheckBinding.vsAutoDetailsOne.getViewStub().inflate(); 
Các vấn đề liên quan