2016-07-20 26 views
4

Ich versuche, die Bindung in Daten arithmetische Operation zu verwenden:Rechenoperationen in Layout - Android Data Binding

<Space 
    android:layout_width="match_parent" 
    android:layout_height="@{2 * @dimen/button_min_height}" /> 

Leider erhalte ich:

Error:(47, 47) must be able to find a common parent for int and float 

Irgendwelche Ideen?

+0

Ich verweise Ich denke, Sie können dies mit einem 'BindingAdapter' erreichen, der' layout_height' und einen 'factor' verwendet. Ich weiß nicht, ob es "out of the box" funktioniert ... – yennsarah

Antwort

7

Weil Du int * float Betrieb durchführen, 2 int Wert und @dimen/button_min_height gibt Ihnen float Wert. android:layout_height akzeptiert jedoch nur den Wert float.

Sie können Ihre benutzerdefinierte Bindung Methode wie folgt erstellen:

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

und in XML-Code

android:layout_height="@{(float)2 * @dimen/activity_vertical_margin}" 

convert 2 in float so wird es nicht gibt Ihnen jeden Gussfehler.

Von oben Code erhalten Sie RunTimeException : You must supply a layout_height attribute. erhalten, inorder, dass Fehler zu lösen, bieten default Wert layout_height

android:layout_height="@{(float)2 * @dimen/activity_vertical_margin, default=wrap_content}" 

this offizielle Dokumentation für default Attribut Konzept finden, oder Sie können this answer auch

+0

Leider danach: android: layout_height = "@ {(float) 2 * @ Dimen/button_min_height, default = wrap_content}" Ich erhalte: kann nicht Setter für Attribut finden 'android: layout_height' mit Parametertyp schweben auf android.widget.space. –

+0

Haben Sie die BindingAdapter-Methode deklariert? –

+0

Vergessen zum Neuaufbau. Jetzt funktioniert es! Ich entschied mich, Dimen zu int zu werfen, weil ViewGroup.LayoutParams.height int ist. Könnten Sie in Erwägung ziehen, Ihre Antwort zu bearbeiten, oder gibt es einen Grund für das Floaten? –

-2

Sie sollten dies programmgesteuert tun. In der XML-Datei android hinzufügen: id-Attribut zu Ihrer Raumansicht:

<Space 
    android:id="@+id/space" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

in Ihrer Java-Klasse sollen Sie dies wirten:

Space space = findViewById(R.id.space); 
space.getLayoutParams().height = 2 * getResources().getDimension(R.dimen.button_min_height); 
space.requestLayout(); 
+1

Ich weiß, ich kann. Aber meine Frage bezog sich auf Datenbindung. –