51 votes

liaison de données - avertissement safeUnbox

après je l'ai mise à niveau COMME gradle version 2.3.0, la liaison de données, un message d'avertissement :

Avertissement:selectMap[index] est un coffret de terrain, mais il doit être non-boîte à exécuter selectMap[index] ? @android:couleur/blanc : @android:couleur/transparent. Cela peut causer des entrées en phase nationale si la Liaison de Données en toute sécurité qu'il unbox. Vous pouvez modifier l'expression et explicitement envelopper selectMap[index] avec safeUnbox() pour éviter l'avertissement

selectMap est un ObservableMap, alors je recherche cet avertissement, mais a eu quelques discussions et n'a pas le fixer

Android Studio 2.3.0-alpha1: liaison de données + int unboxing causes des erreurs de compilation

La liaison de données - objet de données est nul sur l'API 15-18

J'ai suivi le chemin dans les liens, modifier selectMap[index] de safeUnbox(selectMap[index]) , mais a eu erreur de syntaxe.

Si quelqu'un sait comment résoudre cet avertissement?


Edit : Voici le fichier xml code

<?xml version="1.0" encoding="utf-8"?>

<data class="SupportCountryViewHolderBinding">

    <variable
        name="viewModel"
        type="com.goodarc.care_about.activity.account.support_country.SupportCountryHolderViewModel" />

    <variable
        name="dataSource"
        type="com.goodarc.care_about.module.assets_file.SupportCountry" />

    <variable
        name="selectMap"
        type="android.databinding.ObservableMap&lt;Integer, Boolean&gt;" />

    <variable
        name="index"
        type="int" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@{selectMap[index] ? @android:color/white : @android:color/transparent}"
    android:onClick="@{(v) -> viewModel.onItemSelectListener(selectMap, index)}"
    android:orientation="vertical"
    android:padding="20dp">

    <TextView
        style="@style/TitleLabel2"
        android:layout_gravity="center_vertical|start"
        android:text="@{dataSource.display}"
        android:textColor="@{selectMap[index] ? @android:color/black : @android:color/white}"
        tools:text="Taiwan (+886)" />
</LinearLayout>

La construction est de réussir, mais l'avertissement de sortir(j'ai passé au-dessus).

35voto

Leandro D'Onofrio Points 299

J'ai eu le même avertissement, dans mon cas changer la déclaration de variable de type booléen type booléen résoudre le problème:

De:

 <variable
        name="readOnly"
        type="Boolean" />
 

À:

 <variable
        name="readOnly"
        type="boolean" />
 

Alors peut-être que vous pouvez essayer avec:

 <variable
    name="selectMap"
    type="android.databinding.ObservableMap&lt;Integer, boolean&gt;" />
 

22voto

dazza5000 Points 1791

Vous pouvez ajouter safeUnbox comme ceci:

 android:text="@{Double.toString(safeUnbox(product.listPrice))}"
 

15voto

Khemraj Points 8449

w: avertissement: activé est un coffret de champ, mais elle doit être de l'onu-en coffret pour exécuter android:vérifié.

Cet avertissement vient du fait que, permis à terrain peut être null. Si vous prenez l' Boolean au lieu de boolean, alors Boolean peut être null. Si cet avertissement vient. Que ce champ peut faire NullPointerException.

---------------- Cas 1 - Un Moyen De Liaison----------------

<variable
    name="enabled"
    type="Boolean"/>

....

<Switch
    android:checked="@{enabled}"
    />

Solution 1

<Switch
    android:checked="@{safeUnbox(fieldName)}"
    />

Solution 2

Variation Boolean de type primitif boolean. De sorte qu'il ne soit jamais nulle, la valeur par défaut de boolean est false.

<variable
    name="enabled"
    type="boolean"/>

---------------- Cas 2 - La Liaison Bidirectionnelle---------------- Lorsque vous avez deux voies de liaison, alors vous ne pouvez pas utiliser safeUnbox() manière, parce que, safeUnbox() ne sera pas inversée.

<variable
    name="enabled"
    type="Boolean"/>

....

<Switch
    android:checked="@={enabled}"
    />

Cela ne fonctionnera pas maintenant.

<Switch
    android:checked="@{safeUnbox(fieldName)}"
    />

Solution 1

Variation Boolean de type primitif boolean. De sorte qu'il ne soit jamais nulle, la valeur par défaut de boolean est faux.

<variable
    name="enabled"
    type="boolean"/>

Solution 2

Un long chemin est à faire inverse de liaison des adaptateurs pour safeUnbox. Voir ici.

Qu'est-ce que safeUnbox() la méthode?

safeUnbox() seulement de vérifier la valeur null return valeur non null. Vous pouvez voir ci-dessous les méthodes qui sont définies dans la liaison de Données de la bibliothèque.

public static int safeUnbox(java.lang.Integer boxed) {
    return boxed == null ? 0 : (int)boxed;
}
public static long safeUnbox(java.lang.Long boxed) {
    return boxed == null ? 0L : (long)boxed;
}
public static short safeUnbox(java.lang.Short boxed) {
    return boxed == null ? 0 : (short)boxed;
}
public static byte safeUnbox(java.lang.Byte boxed) {
    return boxed == null ? 0 : (byte)boxed;
}
public static char safeUnbox(java.lang.Character boxed) {
    return boxed == null ? '\u0000' : (char)boxed;
}
public static double safeUnbox(java.lang.Double boxed) {
    return boxed == null ? 0.0 : (double)boxed;
}
public static float safeUnbox(java.lang.Float boxed) {
    return boxed == null ? 0f : (float)boxed;
}
public static boolean safeUnbox(java.lang.Boolean boxed) {
    return boxed == null ? false : (boolean)boxed;
}

Je l'ai expliqué sur Boolean, cette solution est de même pour les Integer, Double, Character etc.

9voto

Eugen Martynov Points 5651

Au lieu de ObservableField<T> vous devez utiliser une version spéciale pour les primitives:

  1. ObservableInt de la int
  2. ObservableBoolean de la boolean
  3. ObservableFloat de la float
  4. ObservableChar de la char
  5. ObservableLong de la long
  6. ObservableByte de la byte
  7. ObservableShort de la short

6voto

JimmyFlash Points 309

J'ai eu cet avertissement popup quand j'ai fait quelque chose comme:

  android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"
 

ajout de safeunbox comme ceci:

  android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
 

enlevé l'avertissement après la reconstruction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X