2016-01-16 3 views
8

Я хочу установить поля на основе размеров, которые я создал в dimens.xml. Размеры, которые он сам прекрасно работает, его просто привязка данных не может найти его в следующем примере:Android databinding - Как получить размеры от dimens.xml

<TextView 
      android:id="@+id/title_main" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@+id/disableButton" 
************* 
     android:layout_marginBottom="@{@bool/showAds ? 
@dimen/frontpage_margin_ads: @dimen/frontpage_margin_noads}" 
*************   
android:gravity="center_horizontal" 
     android:text="@string/app_name" 
     android:textColor="@android:color/holo_orange_dark" 
     android:contentDescription="@string/app_name" 
     android:textSize="64sp" 
     android:textStyle="bold" /> 

он нашел его, но он говорит, что marginbottom не может принимать тип float. Как я могу это исправить? Я попробовал кастинг как dimens, так и int, но потом он жалуется, что его нельзя отличить от int.

Мой файл Размер XML выглядит следующим образом:

<resources> 

    <!-- Default screen margins, per the Android Design guidelines. --> 
    <dimen name="activity_horizontal_margin">16dp</dimen> 
    <dimen name="activity_vertical_margin">16dp</dimen> 
    <dimen name="bigText">44sp</dimen> 
    <dimen name="littleText">44sp</dimen> 
    <dimen name="mediumText">40sp</dimen> 
     <dimen name="smallText">24sp</dimen> 
    <dimen name="fab_margin">16dp</dimen> 
    <dimen name="frontpage_margin_noads">0dp</dimen> 
    <dimen name="frontpage_margin_ads">13dp</dimen> 


</resources> 

ответ

21

Проблема здесь не с размерами, но с android:layout_marginBottom. Нет встроенной поддержки для любых атрибутов LayoutParams. Это было сделано для удаления «ногой», который многие могли бы использовать для привязки переменных к LayoutParams и, возможно, попытаться использовать привязку данных для анимирования своих позиций таким образом.

Data Binding идеально подходит для использования в вашем примере, и вы можете легко добавить свой собственный. Это было бы так.

@BindingAdapter("android:layout_marginBottom") 
public static void setBottomMargin(View view, float bottomMargin) { 
    MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams(); 
    layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin, 
     layoutParams.rightMargin, Math.round(bottomMargin)); 
    view.setLayoutParams(layoutParams); 
} 

Вы бы, конечно, добавить левый, верхний, правый, начало, и конец BindingAdapters, а также.

+0

Где я должен писать этот код? Будут ли все макеты, которые я укажу marginBottom, использовать этот метод или только привязывающие данные или только этот конкретный макет? –

+0

Вы можете добавить это в любой (общедоступный) класс в проект, у которого включена привязка данных. Он будет использоваться для всех атрибутов полей привязки данных. –

+0

Проблема проста: поле не является свойством представления, а экземпляром макета представления. Вы можете делать то, что вы пробовали, с другими свойствами представления, например дополнением, но есть веская причина, почему атрибуты поля имеют префикс 'layout_'. – racs

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