2016-03-16 3 views
6

У меня есть класс CustomView с макетом привязки, который принимает переменную. В макете, который содержит CustomView, я хочу передать атрибут в CustomView, и этот CustomView передает этот атрибут в привязку собственного макета. Вот что у меня есть:Получить привязку из класса вида

Это приводит к сбоям при попытке извлечь привязку из вида. Возможно ли это? Вот трассировки стека:

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) 

И если я изменю

DataBindingUtil.getBinding(inCustomView) 

в

DataBindingUtil.bind(inCustomView) 

тогда я получаю это:

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) 

Это может означать, что расположение файл не отформатирован для привязки данных, b это есть. Он имеет элемент макета, а элемент данных - переменные и все.

+0

Можете ли вы опубликовать трассировку стека? – Submersed

+0

Предоставлено, а также немного больше информации – KairisCharm

ответ

15

Чтобы создать привязку данных, вы должны привязать завышенный вид. В вашем примере вы связываете контейнер макета.

Вы можете сделать это несколькими способами. Проще всего связать его как часть инфляции:

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); 
    } 
    ... 
} 

Вам не нужно обязывающее адаптер, если вы не хотите, сеттер, как часть вашего пользовательского вида. В этом случае вам все равно нужен способ, чтобы получить привязки, поэтому вам нужно добавить что-то вроде этого:

public CustomViewBinding getBinding() { return mBinding; } 

так что ваш обязательного адаптер работает.

Если вы знаете, что содержание LinearLayout все будет с надутым видом, вы можете использовать связывающую адаптер, как это:

@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); 
} 

Если ваш пользовательский вид не очень обычай, вы можете просто включают в себя макет непосредственно:

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

Вы, конечно, должны двигаться LinearLayout в custom_view.xml.

+0

Эй, @George, можете ли вы описать, как сгенерирован класс CustomViewBinding? – Ajay

+0

Предположим, у меня есть класс CustomViewPager, поэтому мне нужно написать xml для этого также для создания класса CustomViewPagerBinding? – Ajay

+0

игнорировать это сообщение, я решил эту проблему, добавив дополнительный xml для CustomViewPager, спасибо :). – Ajay

Смежные вопросы