2016-03-16 13 views
6

Tôi có một lớp CustomView với bố cục dữ liệu có một biến. Trong bố cục có chứa CustomView, tôi muốn chuyển một thuộc tính vào CustomView và có CustomView chuyển thuộc tính đó vào liên kết của bố cục riêng của nó. Dưới đây là những gì tôi có:Nhận ràng buộc từ lớp xem

public class CustomView extends LinearLayout 
{ 
public CustomView(Context inContext, AttributeSet inAttrs) 
{ 
    super(inContext, inAttrs); 

    inflate(inContext, R.layout.custom_view, null); 
} 



@BindingAdapter({"app:variable"}) 
public static void SetVariable(CustomView inCustomView, VariableType inMyVariable) 
{ 
    CustomViewBinding binding = DataBindingUtil.getBinding(inCustomView); 

    binding.setMyVariable(inMyVariable); 
} 
} 

Sự cố này cố gắng trích xuất ràng buộc từ chế độ xem. Điều này thậm chí có thể? Dưới đây là stack trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'void xxx.databinding.CustomViewBinding.setVariableType(xxx.VariableType)' on a null object reference 
                      at xxx.CustomView.SetDynamicList(CustomView.java:32) 
                      at xxx.MyFragmentBinding.executeBindings(MyFragmentBinding.java:116) 
                      at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350) 
                      at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167) 
                      at android.databinding.ViewDataBinding$7.doFrame(ViewDataBinding.java:233) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:856) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:603) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Và nếu tôi thay đổi

DataBindingUtil.getBinding(inCustomView) 

để

DataBindingUtil.bind(inCustomView) 

sau đó tôi có được điều này:

java.lang.IllegalArgumentException: View is not a binding layout 
                      at android.databinding.DataBindingUtil.bind(DataBindingUtil.java:166) 
                      at android.databinding.DataBindingUtil.bind(DataBindingUtil.java:140) 
                      at xxx.CustomView.SetDynamicList(CustomView.java:30) 
        -              at xxx.databinding.MyFragmentBinding.executeBindings(MyFragmentBinding.java:116) 
                      at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350) 
                      at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167) 
                      at android.databinding.ViewDataBinding$7.doFrame(ViewDataBinding.java:233) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:856) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:603) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

này có thể ngụ ý rằng cách bố trí tệp không được định dạng cho databinding, b ut nó là. Nó có phần tử layout và phần tử dữ liệu với các biến và mọi thứ.

+0

Bạn có thể đăng theo dõi ngăn xếp của mình không? – Submersed

+0

Được cung cấp, cùng với một chút thông tin hơn – KairisCharm

Trả lời

15

Bạn phải ràng buộc chế độ xem tăng cao để tạo ràng buộc dữ liệu. Trong ví dụ của bạn, bạn đang ràng buộc ngăn chứa chứa của bố cục.

Bạn có thể thực hiện việc này bằng nhiều cách. Cách dễ nhất là ràng buộc nó như là một phần của lạm phát:

public class CustomView extends LinearLayout 
{ 
    CustomViewBinding mBinding; 
    public CustomView(Context inContext, AttributeSet inAttrs) 
    { 
    super(inContext, inAttrs); 
    LayoutInflater inflater = LayoutInflater.from(inContext); 
    // I assume you want it inflated into this ViewGroup 
    mBinding = CustomViewBinding.inflate(inflater, this, true); 
    } 

    public void setVariable(CustomView inCustomView, VariableType inMyVariable) { 
    mBinding.setVariable(inMyVariable); 
    } 
    ... 
} 

Bạn không thực sự cần bộ điều hợp ràng buộc trừ khi bạn không muốn thiết lập như một phần của chế độ xem tùy chỉnh của mình. Trong trường hợp đó, bạn vẫn sẽ cần một cách để có được sự ràng buộc, vì vậy bạn sẽ cần phải thêm một cái gì đó như thế này:

public CustomViewBinding getBinding() { return mBinding; } 

để bộ nối tiếp hoạt động.

Nếu bạn biết rằng các nội dung LinearLayout là tất cả sẽ là từ quan điểm lạm phát, bạn có thể sử dụng một bộ chuyển đổi ràng buộc như thế này:

@BindingAdapter({"app:variable"}) 
public static void setVariable(CustomView inCustomView, VariableType inMyVariable) 
{ 
    if (inCustomView.getChildCount() == 0) { 
     return; 
    } 
    View boundView = inCustomView.getChildAt(0); 
    CustomViewBinding binding = DataBindingUtil.getBinding(boundView); 

    binding.setMyVariable(inMyVariable); 
} 

Nếu giao diện tùy chỉnh của bạn không phải là rất tùy chỉnh, bạn có thể đơn giản bao gồm bố cục của bạn trực tiếp:

<include layout="@layout/custom_view" app:variable="@{myVariableValue}"/> 

Tất nhiên, bạn phải di chuyển LinearLayout vào custom_view.xml.

+0

Hey @George bạn có thể mô tả cách lớp CustomViewBinding được tạo ra không? – Ajay

+0

Giả sử tôi có lớp CustomViewPager vì vậy tôi phải viết một xml cho điều này cũng để tạo ra lớp CustomViewPagerBinding? – Ajay

+0

bỏ qua thông báo này tôi đã giải quyết vấn đề này bằng cách thêm xml cho CustomViewPager cảm ơn :). – Ajay

Các vấn đề liên quan