Программно подкрасить опорный вектор

Android Studio версии 2.1, версия gradle 2.1.0, пожалуйста, исправьте меня, если вы обнаружите какие-либо неверные интерпретации :)

Я запутался насчет векторов поддержки в библиотеке поддержки 23.3.0. В частности, я хотел бы подкрасить программную кнопку изображения, чей src определен для рисования вектором. Из того, что я могу сказать, это не возможно на предварительном леденце на палочке теперь.

Я прочитал несколько связанных постов об изменениях:23.2.0 объявление и изменения:

Начиная с библиотеки поддержки Android 23.3.0, поддерживаемые векторные рисунки могут быть загружены только через app: srcCompat или setImageResource ().

Означает ли вышесказанное, что вектор xmls можно использовать только перед началом Lollipop через srcCompat или setImageResource (), и поэтомуне может быть динамически тонирован?

Вот моя основная кнопка с изображением:

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

Работает только на Lollipop и выше:

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

Попытки бросков перед леденцом на палочке:android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf

Также работает только на Lollipop и выше

    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);

Это бросает ту же ошибку на pre-Lollipop.

Однако если я удалюvectorDrawables.useSupportLibrary = true как указаноЯн Лейк здесьс намерением иметь инструменты сборки автоматически генерировать png для устройств перед Lollipop,pngs не подкрашивают перед леденцом на палочкетак что я вернулся к исходной точке.

Я также попытался указать вектор черезsrcCompat и извлекать его программно, но я не думаю, что смог достичь этого, даже если он работает на пост-леденце, если вектор указан с использованиемsrc вместо.

Таким образом, ситуация для 23.3.0 выглядит так:

Пост-леденец:src а такжеsrcCompat принимать только векторыsrc может быть извлечен из вида как чертеж для программного тонирования. Ссылка на векторы в коде возможна с помощью getDrawable, и они могут быть окрашены.

Pre-Lollipop: srcCompat может принимать только векторы, не может быть получен программно из представления для тонирования.setImageResource может принимать векторы, но только еслиvectorDrawables.useSupportLibrary = falseи тонировка не работает. Аналогично ссылаться на векторы в коде невозможно, если толькоvectorDrawables.useSupportLibrary = false и тонировка не работает.

Работа на всех версиях с использованием pngs:

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

Приложение:

Эта техника также работает с пост-леденцом на палочке, но, как и другие на пред-леденце, я получаю рисование, но не тонирую:

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

ВИД РЕШЕНИЯ:

БлагодаряДжон ответьте, что пока единственный надежный способ, которым я могу придумать, чтобы подкрасить опорный вектор, это установить на него цветной фильтр - это означает, чтоDrawableCompat.setTint() функция, по-видимому, не работает для меня, если рассматриваемый объект является вектором поддержки. Я не уверен, является ли это допустимой ошибкой, ожидаемым поведением или я просто делаю что-то не так!

Вот решение, которое я выберу на данный момент:

    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);

Ответы на вопрос(2)

Ваш ответ на вопрос