2016-01-18 5 views
6

Sto cercando di associare un valore booleano che indica a ImageView se le dimensioni dello schermo sono piccole, quindi si restringe se ho bisogno di più spazio per altri componenti. Sto usando il DataBinding Library per farlo.Come associare layout_width e layout_height utilizzando l'associazione dati in Android

mio layout cui larghezza e altezza dipende da questa booleana:

... 
<data> 
    ... 
    <variable name="smallScreen" type="boolean"/> 
    ... 
</data> 
... 
<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 
... 

Se cerco solo di costruire il mio progetto come questo, il compilatore dice layout_width non può accettare il tipo float. Va bene, io uso la classe BindingAdapter per creare un galleggiante entrare per gli attributi di layout, come segue:

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

@BindingAdapter("android:layout_height") 
public static void setLayoutHeight(View view, float height) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.height = (int) height; 
    view.setLayoutParams(layoutParams); 
} 
... 

che permette il mio progetto di costruire. Ma quando il layout è finalmente reso, cado nella seguente eccezione:

java.lang.RuntimeException: Binary XML file line #21: You must supply a layout_width attribute. 

Solo per informazioni, le mie dimensioni sono impostate in unità dp, come segue:

<dimen name="img_small_screen_size">100dp</dimen> 
<dimen name="img_big_screen_size">208dp</dimen> 

Qualcuno sa come si può Sovrascrivo l'attributo layout_width in modo da poter utilizzare direttamente il database con le dimensioni?

risposta

5

Ho appena capito come ho scritto la mia domanda. Ho appena usato un altro attributo per legare quello che volevo cambiato, il codice si è conclusa in questo modo:

<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 

Così i miei BindingAdapters diventato questo:

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

@BindingAdapter("android:layout_height") 
public static void setLayoutHeight(View view, float height) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.height = (int) height; 
    view.setLayoutParams(layoutParams); 
} 
+2

È anche possibile utilizzare "android: layout_width". Non devi usare il tuo spazio dei nomi. –

+0

è vero, ho appena modificato la mia risposta –

+2

Ora la tua risposta è la stessa della domanda – Bolein95

2

Si dovrebbe aggiungere un valore predefinito, vale a dire,

android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}" 
+0

Grazie. l'impostazione del valore predefinito risolve il mio problema. Ma ho un dubbio, il valore predefinito non verrà mai eseguito, verrà eseguito il primo o il secondo valore, quindi perché il valore predefinito? – Shubham

+0

Grazie! Anche il tuo post mi ha aiutato! – Sam