2016-01-16 6 views
8

dimens.xmlで作成したディメンションに基づいてマージンを設定したい場合は、そのデータバインディングは次のケースで見つけることができます:Androidのデータバインディング - 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" /> 

それが見つかりましたが、マージンボトムはタイプフロートできません。どうすればこの問題を解決できますか?私は両方の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にバインドするために使用するかもしれない "フットガン"を削除するために行われ、データバインディングを使用してこの方法でポジションをアニメートしようと試みる可能性があります。

データバインディングは、あなたの例で使用するのに最適であり、あなた自身で簡単に追加することができます。それはこのようなものでしょう。

@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

関連する問題