EditText drwableLeft не работает с векторами

В моем приложении я использую векторные чертежи, добавленные в библиотеку поддержки 23.2 для отображения значков векторов, и он отлично работает, но когда я устанавливаю вектор в drawableLeft из EditText, он делает не работают в версиях до и после леопарда. Во время выполнения возникает Исключение ResourceNotFound.

Caused by: android.content.res.Resources$NotFoundException: File 
res/drawable/layer_ic_user.xml from drawable resource ID #0x7f0200b3

Это моя конфигурация gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
    applicationId "com.example.test"
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    vectorDrawables.useSupportLibrary = true
    generatedDensities = []
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
       'proguard-rules.pro'
    }
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/res/assets/'] } }
  }

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
compile 'com.android.support:design:23.3.0'
}
apply plugin: 'com.google.gms.google-services'

EditText:

     <EditText
        android:id="@+id/et_username_or_email"
        android:layout_width="@dimen/edit_text_width"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/layer_list_ic_user"
        android:textColorHint="@color/ColorBlackPrimary"
        android:inputType="textEmailAddress|text"
        android:textColor="@color/ColorBlackPrimary"
        android:textSize="@dimen/text_small"
        />

Ответ 1

Обновление

Начиная с Android Support Library, версия 23.4.0

Добавлен метод AppCompatDelegate.setCompatVectorFromResourcesEnabled() для повторного включения использования векторных чертежей в объектах DrawableContainer на устройства под управлением Android 4.4 (API уровня 19) и ниже. Подробнее см. AppCompat v23.2 - Возраст векторов.

Вы должны добавить static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } в начало своей деятельности.


Вы используете AppCompat 23.3. От Разработчики Android

Для пользователей AppCompat мы решили удалить функциональные возможности, которые позволяют использовать векторные чертежи из ресурсов на устройствах, предшествующих Lollipop, из-за проблем, обнаруженных в реализации в версии 23.2.0/23.2.1. Использование приложения: srcCompat и setImageResource() продолжают работать.

Ответ 2

Вы можете добавить Vector Drawable в EditText программно. Используйте VectorDrawableCompat для добавления drawableLeft/drawableRight/drawableTop/drawableBottom/drawableStart/drawableEnd.

Шаги:

я. Удалите android:drawableLeft="@drawable/layer_list_ic_user"

II. Если EditText находится внутри Activity:

EditText etUserName= (EditText)findViewById(R.id.et_username_or_email);
VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getResources(), R.drawable.layer_list_ic_user, etUserName.getContext().getTheme());
etUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null);

III. Если EditText находится внутри фрагмента:

EditText etUserName= (EditText)view.findViewById(R.id.et_username_or_email);
VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getActivity().getResources(), R.drawable.layer_list_ic_user, etUserName.getContext().getTheme());
etUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null);

Для получения дополнительной информации о VectorDrawableCompat см. ссылку

Ответ 3

Векторные drawables не будут работать на устройствах до леденцов, как drawableLeft/drawableRight/.., Не устанавливайте drawableLeft в EditText xml. После инициализации EditText установите drawableLeft, как показано ниже.

et_username_or_Email.setCompoundDrawablesWithIntrinsicBounds(R.drawable.layer_list_ic_user, 0, 0, 0);

Ответ 4

Я сталкиваюсь с этой проблемой и решая ее, поместив векторное изображение внутри списка слоев, как показано: search_grey.xml

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_search_grey" /> 
</layer-list>

и в EditText:

        android:drawableLeft="@drawable/search_grey"

Ответ 5

AppCompatTextView теперь поддерживает app:drawableLeftCompat, app:drawableTopCompat, app:drawableRightCompat, app:drawableBottomCompat, app:drawableStartCompat и app:drawableEndCompat составные рисованные объекты, поддерживающие переносимые типы рисоваемых объектов, такие как VectorDrawableCompat.

Включите это в свой файл Gradle

implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'

В вашем текстовом представлении вы можете использовать

app:drawableLeftCompat
app:drawableStartCompat