2017-02-23 2 views
2

J'ai une méthode qui définit VectorDrawable comme DrawableLeft, DrawableRight, etc. sur TextView et Button, mais je voudrais le faire fonctionner aussi pour Drawable normal. Donc, existe-t-il un moyen de vérifier le type de DrawableRes, ou devrais-je utiliser try/catch? La méthode ressemble à ceci:Vérifiez si DrawableRes est VectorDrawable

public static void setViewDrawables(@NonNull View view, @DrawableRes int left, @DrawableRes int top, @DrawableRes int right, @DrawableRes int bottom) { 
    final Resources resources = view.getResources(); 
    Drawable vectorDrawableLeft = left != 0 ? VectorDrawableCompat.create(resources, left, view.getContext().getTheme()) : null; 
    Drawable vectorDrawableTop = top != 0 ? VectorDrawableCompat.create(resources, top, view.getContext().getTheme()) : null; 
    Drawable vectorDrawableRight = right != 0 ? VectorDrawableCompat.create(resources, right, view.getContext().getTheme()) : null; 
    Drawable vectorDrawableBottom = bottom != 0 ? VectorDrawableCompat.create(resources, bottom, view.getContext().getTheme()) : null; 

    if (view instanceof Button) { 
     ((Button) view).setCompoundDrawablesWithIntrinsicBounds(vectorDrawableLeft, vectorDrawableTop, vectorDrawableRight, vectorDrawableBottom); 
    } 
    else if (view instanceof TextView) { 
     ((TextView) view).setCompoundDrawablesWithIntrinsicBounds(vectorDrawableLeft, vectorDrawableTop, vectorDrawableRight, vectorDrawableBottom); 
    } else { 
     Log.e("ERROR: ViewUtils", "Can't do setCompoundDrawablesWithIntrinsicBounds on " + view.getClass().getName()); 
    } 
} 
+2

si vous voulez '' android.support.v7.content.res.AppCompatResources ? – pskink

+0

Ça marche. Merci! Je viens de remplacer 'VectorDrawableCompat.create (resources, left, view.getContext(). GetTheme())' avec AppCompatResources.getDrawable (view.getContext(), à gauche) '. –

+0

il ya aussi 'android.support.v4.content.res.ResourcesCompat ' mais je ne sais pas si cela fonctionne aussi bien, vous pouvez le vérifier ... – pskink

Répondre

1

Pour résumer les commentaires à une réponse. Pour autant que j'ai trouvé il n'y a pas de moyen facile de savoir si DrawableRes pointe vers VectorDrawable ou non. Si quelqu'un sait comment, s'il vous plaît écrire. Mais pour résoudre mon problème, il suffisait d'utiliser android.support.v7.content.res.AppCompatResources comme suggéré par @pskink. Alors maintenant, la méthode ressemble à:

public static void setViewDrawables(@NonNull View view, @DrawableRes int left, @DrawableRes int top, @DrawableRes int right, @DrawableRes int bottom) { 
    Drawable vectorDrawableLeft = left != 0 ? AppCompatResources.getDrawable(view.getContext(), left) : null; 
    Drawable vectorDrawableTop = top != 0 ? AppCompatResources.getDrawable(view.getContext(), top) : null; 
    Drawable vectorDrawableRight = right != 0 ? AppCompatResources.getDrawable(view.getContext(), right) : null; 
    Drawable vectorDrawableBottom = bottom != 0 ? AppCompatResources.getDrawable(view.getContext(), bottom) : null; 

    if (view instanceof Button) { 
     ((Button) view).setCompoundDrawablesWithIntrinsicBounds(vectorDrawableLeft, vectorDrawableTop, vectorDrawableRight, vectorDrawableBottom); 
    } else if (view instanceof TextView) { 
     ((TextView) view).setCompoundDrawablesWithIntrinsicBounds(vectorDrawableLeft, vectorDrawableTop, vectorDrawableRight, vectorDrawableBottom); 
    } else { 
     Log.e("ERROR: ViewUtils", "Can't do setCompoundDrawablesWithIntrinsicBounds on " + view.getClass().getName()); 
    } 
} 

Mise à jour:

En android.support.v7.widget.AppCompatDrawableManager il existe une méthode boolean isVectorDrawable(@NonNull Drawable d) qui vérifie si Drawable est VectorDrawable, mais il prend Drawable comme argument, et non DrawableRes. Il ressemble à ceci:

private static boolean isVectorDrawable(@NonNull Drawable d) { 
    return d instanceof VectorDrawableCompat 
      || PLATFORM_VD_CLAZZ.equals(d.getClass().getName()); 
} 
+1

si vous voulez savoir comment ils l'ont fait, simple étape- dans 'AppCompatResources.getDrawable' avec votre débogueur et vérifiez quand/comment ils appellent' VectorDrawableCompat.create' quand 'VectorDrawableCompat' doit être créé – pskink

+0

juste quelques lignes après la méthode' isVectorDrawable' il y a 'private static class VdcInflateDelegate implements InflateDelegate' qui gonfle l'objet 'VectorDrawableCompat' – pskink

+0

@pskink Oui, mais comme vous pouvez le voir, c'est une approche try/catch, et j'ai demandé dans la question s'il y avait d'autres façons de le faire. Dans cette méthode, ils essaient de créer VectorDrawable, et si cela ne fonctionne pas, ce n'est pas VectorDrawable. –