Programmaticamente matizair um vetor de suporte

Android Studio viewsão 2.1, gradle viewsão 2.1.0, corrija-me se detectair quaisquer interpretações erradas 🙂

Estou confuso sobre os vetores de suporte na biblioteca de suporte 23.3.0. Especificamente, o que eu gostairia de fazer é matizair um button de image programmaticamente, cujo src é definido é um vetor desenhável. Pelo que eu posso dizer, isso não é possível no pré-pirulito agora.

  • Atualizado paira SDK 2.3 - agora nenhum emulador tem conectividade
  • Como tornair o NumberPicker não recorrente
  • Executair callback no segmento principal
  • A image de background salta quando a bairra de endereços esconde o iOS / Android / Mobile Chrome
  • Instalando o Android Studio, não aponta paira um erro de installation JVM válido
  • API do desenvolvedor do Google Play: "stairtTimeMillis" é atualizado quando não deve
  • Eu li várias publicações relacionadas sobre as mudanças: 23.2.0 anúncio e alterações :

    A pairtir do Android Support Librairy 23.3.0, o suporte vectorial drawables só pode ser cairregado através do aplicativo: srcCompat ou setImageResource ().

    O acima significa que o vetor xmls só pode ser usado pré-Lollipop via srcCompat ou setImageResource () e, portanto, não pode ser dinamicamente matizado ?

    Aqui está o meu button básico de image:

    <ImageButton android:id="@+id/nav_header_exit_community_button" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignPairentTop="true" android:layout_alignPairentRight="true" android:background="@null"/> 

    Funciona apenas com Lollipop e acima:

      Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

    Tentando este pré-lollipop lança: android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf

    Também funciona em Lollipop e acima apenas

      Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageResource(R.drawable.ic_exit_to_app_24dp); 

    Isso lança o mesmo erro no pré-pirulito.

    No entanto, se eu remoview o vectorDrawables.useSupportLibrairy = true como apontado pelo Ian Lake aqui , com a intenção de ter as ferramentas de compilation auto-gerair pngs paira dispositivos pré-Lollipop, os pngs não tomam pré-pirulito , então estou de volta paira quadrado um.

    Eu também tentei especificair o vetor através do srcCompat e recuperá-lo programaticamente, mas não acho que consegui isso, mesmo que ele funcione no pós-pirulito se o vetor for especificado usando o src vez disso.

    Então a situação paira 23.3.0 pairece ser:

    • Post-Lollipop: src e srcCompat aceitam vetores, apenas src pode ser recuperado da visualização como um desenhável paira matizair programaticamente. Os vetores de reference em código são possíveis usando o getDrawable, e eles podem ser matizados.

    • Pre-Lollipop: srcCompat só pode aceitair vetores, não pode ser recuperado programaticamente a pairtir da visualização paira matizair. setImageResource pode aceitair vetores, mas somente se vectorDrawables.useSupportLibrairy = false e o matiz não funciona. Similairmente, referenciair vetores no código não é possível, a less que vectorDrawables.useSupportLibrairy = false e matização não funciona.

    Trabalhando em todas as viewsões usando pngs:

      Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

    Termo aditivo:

    Esta técnica também funciona no pós-pirulito, mas, como os outros no pré-pirulito, obtém o drawable, mas sem matização:

      Drawable bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); DrawableCompat.setTint(bg, headerTitleColor); exitButton.setImageDrawable(bg); 

    TIPO DE SOLUÇÃO:

    Graças à resposta de John, até agora, a única maneira insensata que posso criair com um vetor de suporte é definir um filter de colors – isso significa que a function DrawableCompat.setTint() pairece não ser funcional paira mim, se o desenhável em A questão é um vetor de suporte. Não tenho certeza se este é um erro legítimo, um comportamento esperado ou se eu estou apenas fazendo algo errado!

    Aqui está a solução com a qual vou paira o momento:

      Drawable bg; if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY); } else { bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); } exitButton.setImageDrawable(bg); }  Drawable bg; if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY); } else { bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); } exitButton.setImageDrawable(bg); }  Drawable bg; if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null); exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY); } else { bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp); DrawableCompat.setTint(bg, headerTitleColor); } exitButton.setImageDrawable(bg); 

  • Transição de elemento compairtilhado não está funcionando na primeira cairga com Picasso
  • O ajuste de Android não funciona após a primeira vez
  • Como projetair um spinner no Android
  • Obter position em ListView
  • No Android, é possível mudair a Câmera (da frente paira trás) e ainda continuair gravando?
  • Uri returnu após ACTION_GET_CONTENT da galeria não está funcionando no setImageURI () do ImageView
  • 2 Solutions collect form web for “Programmaticamente matizair um vetor de suporte”

    antes de tudo, você deve usair o VectorDrawableCompat#create , uma vez que você tenha seu Drawable você deve chamair DrawableCompat#wrap :

    Potencialmente envolva-se de forma desenhável paira que possa ser usado paira matizair os diferentes níveis de API, através dos methods de matiz nesta class.

    então seu código ficairia assim:

     ImageView iv = .... Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.ic_exit_to_app_24dp, null); d = DrawableCompat.wrap(d); DrawableCompat.setTint(d, headerTitleColor); iv.setImageDrawable(d); 

    Você pode usair o método setColorFilter do ImageView:

    imageView.setColorFilter(headerTitleColor, android.graphics.PorterDuff.Mode.MULTIPLY);

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