Android Liaison de Données layout_width et layout_height

J'ai besoin d'être en mesure de définir de façon dynamique un EditText, la hauteur de la propriété. Je suis à l'aide de la liaison de données pour d'autres propriétés tout au long de mon application, j'aimerais être en mesure d'utiliser la liaison de données pour contrôler la hauteur de mes éléments. Ici est une version allégée de mon xml:

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

Et ici est une version allégée de mon point de Vue, Modèle:

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

Les dimensions sont dans le dimens.xml fichier. Et je suis de modifier les propriétés dans le modèle de vue. Mais, lorsque je lance l'application, j'obtiens l'erreur suivante immédiatement après le lancement (le bindingadapter n'est pas en tirant sur debug). J'ai plusieurs autres éléments sur l'écran, mais celui-ci en particulier est celui que j'ai besoin de changer la hauteur d'une action particulière se produit:

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.

Il y a un peu de posts sur DONC en ce qui concerne cette question, mais pas de réponses définitives ou de l'approche n'a pas fonctionné. C'est sûrement une mise en œuvre commune. Merci d'avance pour l'aide.

  • "C'est sûrement une mise en œuvre commune" -- considérant que la liaison de données est encore une version release candidate, je ne serait pas en compte tout ce qui est lié à la liaison de données pour être "commun". Je ne serais pas surpris si vous ne pouvez pas définir la hauteur et la largeur de cette façon, tant que les données sont validées immédiatement après le gonflage de la mise en page, et par ce point, vous n'avez pas injecté le modèle encore, et encore moins de définir ces attributs. Il est possible qu'il existe une solution de contournement, à l'aide d'un synthétique de la propriété (par exemple, app:width) que vous appliquez votre expression de liaison à, qui permet d'ajuster votre point de vue est LayoutParams.
  • Vous pouvez être tout à fait exact. Je suppose à cause de ma familiarité avec la liaison de données sur d'autres plates-formes(Windows), j'ai juste attendu qu'elle soit une pratique courante sur Android ainsi.
InformationsquelleAutor John Murphy | 2016-02-09