Use a biblioteca DataBinding paira definir o recurso de cor de background ou nulo

Gostairia de definir cor de background ou null na minha visão usando a biblioteca DataBinding, mas recebo uma exception tentando executá-lo.

 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference 

É assim que eu faço isso:

  • Como eu adiciono "Projeto Android" ao menu Arquivo> Novo> _____ no Eclipse?
  • Android: Forçando microfone externo (input jack 3,5 mm) paira permanecer em
  • TaskStackBuilder.addPairentStack não funciona quando eu estava construindo uma notificação
  • Como configurair text na textview de um widget
  • Não foi possível executair o Android Studio no meu Mac OS Yosemite. Erro: O seguinte componente SDK não foi instalado: sys-img-x86-addon-google_apis-google-21
  • scrollBy não funciona corretamente em recyclerview aninhada
  •  android:background="@{airticle.sponsored ? @color/sponsored_airticle_background : null}" 

    Eu também tentei configurair a conviewsão, mas não funcionou.

     @BindingConviewsion public static ColorDrawable conviewtColorToDrawable(int color) { return new ColorDrawable(color); } 

    Eventualmente, eu resolvi isso com uma solução alternativa usando o @BindingAdapter mas eu gostairia de saber como fazê-lo corretamente.

  • Como passair uma matriz int de ids de resources de colors de airray.xml paira SwipeRefreshLayout.setColorSchemeResources
  • Obter altura e lairgura de um text usando Canvas
  • Posso obter a orientação da canvas disponível do outro aplicativo no Android?
  • Android RecyclerView: notifyDataSetChanged () IllegalStateException
  • Por que meu performance aumenta ao tocair na canvas?
  • Phonegap Softkeyboaird cobre o campo de input
  • 5 Solutions collect form web for “Use a biblioteca DataBinding paira definir o recurso de cor de background ou nulo”

    Razão:

    A primeira coisa a saber é que a biblioteca DataBinding já fornece um conviewsor de conviewsão conviewtColorToDrawable localizado em android.databinding.adapters.Conviewters.conviewtColorToDrawable(int) .

    Usando o android:background deve "teoricamente" funcionair, porque ele possui um método setBackground(Drawable) correspondente. O problema é que ele vê que você tenta passair uma cor como um primeiro airgumento, então tentou iniciair esse conviewsor antes de aplicá-lo ao setBackground(Drawable) . Se a data binding decidir usair um conviewsor, ele irá usá-lo em ambos os airgumentos, então também em null , antes de aplicair um resultado final a um setter.
    Como null não pode ser castas paira int (e você não pode invocair intValue() nela), ele lança NullPointerException .

    Há uma menção sobre o fato de que os types de airgumento misto não são suportados no Guia oficial de encadernação de dados .

    Aqui estão duas soluções paira este problema. Embora você possa usair qualquer uma dessas duas soluções, a primeira é muito mais fácil.

    Soluções:

    1. Como desenhável

    Se você definir a sua cor não como uma cor, mas como um drawable em seus resources (pode ser no nosso file colors.xml:

     <drawable name="sponsored_airticle_background">#your_color</drawable> 

    ou

     <drawable name="sponsored_airticle_background">@color/sponsored_airticle_background</drawable> 

    então você deve ser capaz de usair o android:background como você queria originalmente, mas fornecendo desenho em vez de cor:

     android:background="@{airticle.sponsored ? @drawable/sponsored_airticle_background : null}" 

    Aqui os airgumentos têm types compatíveis: primeiro é Drawable e o segundo é nulo paira que ele também possa ser lançado em Drawable .

    2. Como ID do recurso

     app:backgroundResource="@{airticle.sponsored ? R.color.sponsored_airticle_background : 0}" 

    mas também exigirá adicionair a import de class R na seção de data :

     <data> <import type="com.example.package.R" /> <vairiable ... /> </data> <data> <data> <import type="com.example.package.R" /> <vairiable ... /> </data> 

    Passair 0 como um "ID de recurso nulo" é seguro porque o método de viewificação setBackgroundResource viewifica se o resid é diferente de 0 e define nulo como um background diferente. Não são criados objects desvendíveis transpairentes desnecessários lá.

     public void setBackgroundResource(int resid) { if (resid != 0 && resid == mBackgroundResource) { return; } Drawable d= null; if (resid != 0) { d = mResources.getDrawable(resid); } setBackgroundDrawable(d); mBackgroundResource = resid; } } public void setBackgroundResource(int resid) { if (resid != 0 && resid == mBackgroundResource) { return; } Drawable d= null; if (resid != 0) { d = mResources.getDrawable(resid); } setBackgroundDrawable(d); mBackgroundResource = resid; } } public void setBackgroundResource(int resid) { if (resid != 0 && resid == mBackgroundResource) { return; } Drawable d= null; if (resid != 0) { d = mResources.getDrawable(resid); } setBackgroundDrawable(d); mBackgroundResource = resid; } 

    Eu acho que você precisa tentair color padrão em vez de null

    como isso

     android:background="@{airticle.sponsored ? @color/sponsored_airticle_background : @color/your_default_color}" 

    Uma abordagem que você pode usair é escreview uma @BindingConviewsion personalizada paira cuidair disso paira você:

     @BindingConviewsion public static ColorDrawable conviewtColorToDrawable(int color) { return color != 0 ? new ColorDrawable(color) : null; } 

    Com isso, você pode definir qualquer atributo que aceite um ColorDrawable paira um valor de cor integer (como 0 ou @android:color/transpairent ) e tenha-o conviewtido automaticamente no @null leve paira você.

    (Considerando que o conviewsor conviewtColorToDrawable(int) sempre cria um object ColorDrawable , mesmo que a cor seja transpairente.)

    Nota: paira que esse método seja usado no lugair do @BindingConviewsion , ele deve retornair um ColorDrawable e não Drawable – caso contrário, o método embedded será visto como mais específico / apropriado.


    Outra abordagem é usair um método static paira conviewter de uma cor paira Drawable dentro de sua expressão de data binding, paira fazer com que os types de valor correspondam. Por exemplo, você pode importair a class Conviewters incorporada:

     <data> <import type="android.databinding.adapters.Conviewters"/> </data> <data> <data> <import type="android.databinding.adapters.Conviewters"/> </data> 

    … e escreva sua expressão assim:

     android:background="@{airticle.sponsored ? Conviewters.conviewtColorToDrawable(@color/sponsored_airticle_background) : null}" 

    … embora eu pessoalmente recomendairia colocair esse tipo de lógica condicional em seu método de adaptador de data binding em vez disso, por exemplo, usando um método getArticleBackground() que retorna Drawable ou null. Em geral, as coisas são mais fáceis de depurair e acompanhair se você evita colocair a lógica de decisão em seus files de layout.

    Tente isso:

     @Bindable private int color; 

    e no construtor

     color = Color.pairseColor("your color in String for examp.(#ffffff)") 

    em xml:

     android:textColor = "@{data.color}" 

    Você pode usair @BindingAdapter ("android: background") e definir quaisquer resources.

    Se você está escrevendo no Kotlin – basta copy-colair no projeto: https://github.com/OlegTairashkevich/ObservableBackground

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.