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 estLayoutParams
. - 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.
Vous devez vous connecter pour publier un commentaire.
En Java
Et dans votre XML
importation de l'application, comme ce
layoutParams.height = height.toInt()
àLors de la liaison de données est utilisé, on bande les valeurs de l'XML. Vous pouvez ajouter une valeur par défaut pour être utilisé quand il est dépouillé pour éviter le problème.
voir: http://developer.android.com/tools/data-binding/guide.html (en bas de la page).
Error:(13, 34) Cannot find the setter for attribute 'android:layout_width' with parameter type float on android.widget.LinearLayout.
Selon la discussion sur Android bug tracker, il est impossible de définir la disposition de la hauteur ou de la largeur avec la liaison de données sans créer de liaison personnalisée adaptateurs:
https://code.google.com/p/android/issues/detail?id=180666
La liaison de l'adaptateur nécessaire pour le réglage de la hauteur de vue ressembleraient à ça:
Je l'ai résolu comme ça dans Kotlin.
Faire un fichier appelé
Et de mettre en:
Et puis vous pouvez l'utiliser dans vos mises en page:
Pour moi, fait ce le truc:
Et le xml:
Vous pouvez ajouter un adaptateur de liaison pour android:layout_height qui prend dans un flotteur.
Pour hauteur:
Pour largeur:
Utilisation:
PS:
N'oubliez pas de définir une valeur par défaut