Получить привязку из класса просмотра

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

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

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

 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) 

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

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

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

     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.

    Intereting Posts
    Запись и воспроизведение Android + громкой связи в качестве опции Класс java.util.Map имеет общие параметры типа, вместо этого используйте GenericTypeIndicator Как использовать анимацию перемещения курсора на панели управления материалом? Могу ли я использовать более 2 видов ресайклеров в одном активном андроиде Как использовать Android-камеру или Camera2 API для поддержки старых и новых версий API без заметок? Java был запущен, но вернулся код выхода = 13 eclipse Показывать снятое изображение в новом действии Android реализует SwipeListView с помощью Pull to Refresh MAILTO Ссылка по электронной почте, чтобы начать новое письмо Run-андроид с принудительной обработкой завершился с ошибкой: Выполнение не выполнено для задачи ': app: dexDebug' Невозможно называть defineVisibility () никогда не видел подключения для pid Как определить, когда движется мой просмотр? Как создать приложение для Android с внешними библиотеками с помощью ant? Как получить список всех установленных ярлыков, найденных в главном экране Launcher в android Ресурс доступа, определенный в теме и attrs.xml android