Ich muss die Eigenschaft height eines EditText dynamisch setzen können. Ich verwende Datenbindung für andere Eigenschaften in meiner App, daher würde ich gerne Datenbindung verwenden können, um die Höhe meiner Elemente zu steuern. Hier ist eine abgespeckte Version meiner xml:Android-Datenbindung layout_width und layout_height
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="loginVM" type="com.testing.stuff.ViewModels.LoginViewModel" />
</data>
<EditText android:inputType="number"
android:id="@+id/txtVerificationCode"
android:layout_height="@{loginVM.compact ? @dimen/verificationHeightCompact : @dimen/verificationHeightFull}"
android:layout_width="match_parent"
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_marginLeft="10dp"
android:alpha="@{loginVM.verificationOpacity}"
android:layout_marginStart="10dp"
android:textAlignment="center"
android:visibility="visible"
android:hint="Enter verificationCode"
android:text="@{loginVM.verificationCode}" />
</layout>
Und hier ist eine abgespeckte Version meiner Ansicht Modell:
public class LoginViewModel extends BaseObservable {
public final ObservableField<String> verificationCode;
public final ObservableField<Boolean> compact;
@Bindable
public String getVerificationCode() {
if (this.verificationCode == null) {
return "";
} else {
return this.verificationCode.get();
}
}
public void setVerificationCode(String verificationCode) {
this.verificationCode.set(verificationCode);
invalidateProperties();
}
@Bindable
public Boolean getCompact(){return this.compact.get();}
public void setCompact(Boolean value)
{
this.compact.set(value);
this.invalidateProperties();
}
@BindingAdapter("android:layout_height")
public static void setLayoutHeight(EditText view, float height)
{
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height = (int)height;
view.setLayoutParams(layoutParams);
}
public LoginViewModel(Context ctx) {
verificationCode = new ObservableField();
compact = new ObservableField();
}
Die Abmessungen sind in der dimens.xml Datei. Und ich modifiziere die Eigenschaften im View-Modell. Aber wenn ich die App starte, erhalte ich unmittelbar nach dem Start den folgenden Fehler (der Bindungsadapter feuert nicht auf debug). Ich habe einige andere Elemente auf dem Bildschirm, aber diese besondere ist die, ich brauche die Höhe zu ändern, wenn eine bestimmte Aktion eintritt:
FATAL EXCEPTION: main
Process: com.testing.stuff, PID: 32752
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.testing.stuff/com.testing.stuff.Login}:
java.lang.RuntimeException: Binary XML file line #69: You must supply
a layout_height attribute.
Caused by: java.lang.RuntimeException: Binary XML file line #69: You
must supply a layout_height attribute.
Es gibt ein paar Beiträge über SO bezüglich dieses Problems aber keine endgültigen Antworten oder die Ansatz hat nicht funktioniert. Sicher ist dies eine Implementierung, die üblich ist. Vielen Dank im Voraus für die Hilfe.
"Sicherlich ist dies eine Implementierung, die üblich ist" - man bedenkt, dass die Datenbindung noch ein Release-Kandidat ist, Ich würde * nichts * in Bezug auf die Datenbindung als "üblich" betrachten. Ich würde nicht überrascht sein, wenn Sie die Höhe und Breite nicht auf diese Weise festlegen können, da diese Daten sofort beim Aufblasen des Layouts validiert werden, und zu diesem Zeitpunkt haben Sie das Modell noch nicht injiziert, geschweige denn diese Attribute festgelegt. Es ist möglich, dass es eine Problemumgehung gibt, indem Sie eine synthetische Eigenschaft (z. B. "app: width") verwenden, auf die Sie Ihren Bindungsausdruck anwenden, der die LayoutParams Ihrer Ansicht anpasst. – CommonsWare
Sie können absolut richtig sein. Ich denke, aufgrund meiner Vertrautheit mit Datenbindung auf anderen Plattformen (Windows) habe ich nur erwartet, dass es auch auf Android üblich ist. –