2016-01-16 11 views
8

Voglio impostare i margini in base alle dimensioni che ho creato in dimens.xml Le dimensioni funziona correttamente, il suo solo collegamento dati lo può trovare nel caso di seguito:Associazione dati Android - Come ottenere le dimensioni da dimens.xml

lo ha trovato ma dice che marginbottom non può prendere il tipo float. Come posso risolvere questo? Ho provato a convertire entrambi i valori in int ma poi si lamenta che non può essere convertito in int.

Il mio file XML dimensioni è simile al seguente:

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

risposta

21

Il problema qui non è di dimensioni, ma con android:layout_marginBottom. Non esiste un supporto integrato per gli attributi LayoutParams. Questo è stato fatto per rimuovere la "pistola a piede" che molti potrebbero usare per legare le variabili a LayoutParams e magari tentare di utilizzare l'associazione dati per animare le loro posizioni in questo modo.

Data Binding è perfetto per essere utilizzato nel tuo esempio e puoi facilmente aggiungerne uno. Sarebbe qualcosa di simile.

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

Si potrebbe, ovviamente, aggiungere anche la sinistra, in alto, a destra, iniziare e terminare BindingAdapters pure.

+0

Dove dovrei scrivere questo codice? Tutti i layout che specifichi marginBottom utilizzeranno questo metodo o solo quelli di associazione dei dati o solo questo particolare layout? –

+0

È possibile aggiungere questo su qualsiasi classe (pubblica) in un progetto con associazione dati abilitata. Verrà utilizzato per tutti gli attributi dei margini associati ai dati. –

+0

Il problema è semplice: il margine non è la proprietà della vista, ma l'istanza di layout della vista. Puoi fare ciò che hai provato con altre proprietà di visualizzazione, come il padding, ma c'è una buona ragione per cui gli attributi margin hanno il prefisso 'layout_'. – racs

Problemi correlati