2016-01-16 5 views
8

Ich möchte Ränder basierend auf Dimensionen festlegen, die ich in dimens.xml erstellt habe Die Dimensionen es funktioniert gut, seine nur Datenbindung kann es in dem folgenden Fall finden Sie nicht:Android Databinding - So erhalten Sie Dimensionen aus 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" /> 

es tat es finden, aber es sagt, dass Margin nicht float nehmen. Wie kann ich das beheben? Ich habe versucht, beide Dimensionen int zu werfen, aber dann beschwert es sich, dass es nicht zu int gegossen werden kann.

Meine Dimensionen XML-Datei sieht wie folgt aus:

<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> 

Antwort

21

Das Problem hier ist nicht mit den Abmessungen, aber mit android:layout_marginBottom. Es gibt keine integrierte Unterstützung für LayoutParams Attribute. Dies wurde getan, um den „Fuß gun“ zu entfernen, dass viele könnten Variablen zu binden verwenden, um LayoutParams und vielleicht versuchen, Daten zu verwenden, verbindlich, ihre Positionen auf diese Weise zu animieren.

Datenbindung ist ideal, um in Ihrem Beispiel verwendet werden, und Sie können Ihre eigene leicht hinzufügen. Es wäre so etwas.

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

Sie wäre natürlich, fügen Sie auch die links, oben, rechts, beginnen und BindingAdapters auch beenden.

+0

Wo soll ich diesen Code schreiben? Werden alle Layouts, die ich mit marginBottom angegeben habe, diese Methode verwenden oder nur die Datenbindungsarten oder nur dieses bestimmte Layout? –

+0

Sie können dies für jede (öffentliche) Klasse in einem Projekt hinzufügen, für das die Datenbindung aktiviert ist. Es wird für alle datengebundenen Randattribute verwendet. –

+0

Das Problem ist einfach: die Marge nicht die Eigenschaft der Ansicht ist, aber das Layout Instanz der Ansicht. Sie können das, was Sie versucht haben, mit anderen Ansichtseigenschaften wie Padding machen, aber es gibt einen guten Grund, warum Randattribute das Präfix 'layout_' haben. – racs

Verwandte Themen