Набор привязки данных Android alignParentTop

У меня есть следующий макет (остались только соответствующие части):

<RelativeLayout>
    <View android:layout_alignParentTop="true"/>
</RelativeLayout>

Я попытался установить атрибут layout_alignParentTop с переменной, объявленной в блоке <data>, как показано здесь:

<data>
    <variable
        name="condition"
        type="Boolean"/>
</data>

<RelativeLayout>
    <View android:layout_alignParentTop="@{condition}"/>
</RelativeLayout>

Однако при попытке скомпилировать студия Android говорит следующее:

Ошибка: не удается найти установщик для атрибута android:layout_alignParentTop с типом параметра java.lang.Boolean.

Как я могу установить атрибут layout_alignParentTop с переменной привязки данных?


person Mikhail    schedule 08.12.2015    source источник
comment
может ли это быть чувствительным к регистру? Вы пробовали boolean со строчной буквой B?   -  person AdamMc331    schedule 08.12.2015
comment
@McAdam331 McAdam331 Я только что попробовал это с boolean, все еще не работает, ошибка та же.   -  person Mikhail    schedule 08.12.2015


Ответы (2)


Мне пришлось немного покопаться в этом, и я обнаружил недавнюю проблему в Google Code.

Цитирую одного из участников проекта:

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

Чтобы реализовать их для своего приложения, создайте адаптер привязки:

@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, int width) {
  LayoutParams layoutParams = view.getLayoutParams();
  layoutParams.width = width;
  view.setLayoutParams(layoutParams);
}

В вашем случае вам просто нужно немного настроить его для атрибута alignParentTop:

@BindingAdapter("android:layout_alignParentTop")
public static void setAlignParentTop(View view, boolean alignParentTop) {
   RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT,
      RelativeLayout.LayoutParams.WRAP_CONTENT);

   if(alignParentTop) {
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
   }

   view.setLayoutParams(layoutParams);
}

Это не проверено, но этого должно быть достаточно, чтобы направить вас на правильный путь.

person AdamMc331    schedule 08.12.2015
comment
Я реализовал это через @BindingAdapter, но надеялся на более изящный способ. Спасибо, в любом случае! - person Mikhail; 08.12.2015
comment
@Аркадий рад помочь! Я рад, что мой 500-й ответ был хорошим, ха-ха. Жаль, что другого пути нет, но, по крайней мере, теперь вы точно знаете, что его нет. - person AdamMc331; 08.12.2015
comment
Просто примечание для будущих читателей: этот код, как и любые другие экземпляры @BindingAdapter, можно поместить в любой понравившийся вам класс (например, только что созданный BindingAdapters.java). Затем он будет распознан в процессе привязки данных и позволит продолжить компиляцию без ошибок, подобных упомянутым в вопросе. - person Dev-iL; 23.01.2016

@BindingAdapter("android:layout_alignParentLeft")
public static void setAlignParentLeft(View view, boolean alignParentLeft) {
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
            view.getLayoutParams()
    );

    if (alignParentLeft) {
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    }

    view.setLayoutParams(layoutParams);
}

этот код более универсален и не применяет wrap_content для каждого представления

person KLM    schedule 20.12.2016