ProgramingTip

지원 라이브러리 VectorDrawable 리소스 $ NotFoundException

bestdevel 2020. 11. 9. 20:27
반응형

지원 라이브러리 VectorDrawable 리소스 $ NotFoundException


Design Support Library 버전 23.4.0을 사용하고 있습니다. gradle 플래그를 활성화했습니다.

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

빌드 도구 버전 23.0.2를 사용 하고 여전히 Resources$NotFoundExceptionKitKat 이하를 사용하고 있습니다.

android:drawableLeft또는 사용할 때 발생 imageView.setImageResource(R.drawable.drawable_image)합니다.

그리고 예, 드로어 블을 사용하는 모든 활동에 적용하고 있습니다.

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

지원 라이브러리의 버그입니까?


지원 라이브러리 23.4.0을 사용하여이를 수행 할 세 가지 별도의 작업이 필요했습니다.

  1. 빌드 .gradle에 추가하십시오.

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  2. 애플리케이션 클래스의 onCreate에 다음을 추가하십시오.

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  3. 벡터 드로어 블 교체를 설정하는 모든 xml보기의 경우

    android:src
    

    app:srcCompat
    

    코드에서 다음을 바꿉니다.

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    

여기에 대한 답변 중 일부를 보완 하기 위해 VectorDrawables에 대한 이전 버전과 호환되는 지원에는 가격이 제공되며 모든 경우에 작동하지 않습니다 .

어떤 경우에 작동합니까? 도움 유효하도록 이 다이어그램만들었습니다 (지원 라이브러리 23.4.0에서 최소 25.1.0까지 함).

VectorDrawable 치트 시트


다음을 사용합니다.

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);이 방법으로 추가 할 필요가 없습니다 .

VectorDrawableCompat를 사용하여 벡터 드로어 블을 확장하기 만하면 모든 설정이 완료됩니다.


우리는 같은 문제가 있습니다. 벡터 드로어 블이 Kitkat에서 가능성이 있습니다. AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);활동의 onCreate 메소드를 추가 하여이 문제를 해결했습니다 .

그 전에 추가하는 것을 잊지 마세요.

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

벡터 드로어 블을 사용하는 뷰에 대해 setImageResource를 호출합니다. 내 견해는 ImageButton입니다. Android SDK 빌드 도구 버전 23.0.3이 있습니다.


파티에 늦어서 죄송하지만이 답변은 플래그 AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); 를 사용하려는 사용자에게 도움이 될 수 있습니다 . 모든 활동에.

1. 애플리케이션 (android.app.Application)으로 확장되는 클래스 생성

public class MyApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

2. Manifest.xml로 이동하여 태그에 다음 행을 추가하십시오.

<application
    android:name=".MyApplicationClass"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ...
</application>

3. MyApplicationClass.java에서 onCreate 위에 다음 코드를 추가합니다.

// This flag should be set to true to enable VectorDrawable support for API < 21
static
{
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

MyApplicationClass.java의 전체 코드

import android.app.Application;
import android.support.v7.app.AppCompatDelegate;

/**
* Created by Gaurav Lonkar on 23-Dec-17.
*/

public class MyApplicationClass extends Application
{
    // This flag should be set to true to enable VectorDrawable support for API < 21
    static
    {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

app.gradle에서 이것을 사용하십시오.

그런 다음 AppCompatDrawableManagersetDrawable 및 getDrawable에 사용하십시오. 나를 위해 작동


같은 장소에서 벡터 드로어 블에 대한 지원 android:drawableLeft은 지원 라이브러리 23.3에서 벡터 드로어. Google+ 에서 발표되었습니다 .

버전 23.2.0 / 23.2.1의 구현에서 발견 된 문제로 인해 롤리팝 이전 기기의 리소스에서 벡터 드로어 블을 사용할 수있는 기능을 제거하기로 결정했습니다. app : srcCompat 및 setImageResource () 사용은 계속 작동합니다.

문제에 대한 링크 :

그러나 이러한 문제를 해결할 수 있다면 23.4에서 AppCompatDelegate.setCompatVectorFromResourcesEnabled () 를 사용하여이 기능을 다시 활성화 할 수 있습니다 .

이것이 어떻게 작동하는지 궁금하다면이 기능을 만든 Chris Banes가 가장 잘 배울 수있는 사람입니다. 그는 자신의 블로그 에서 자세히 설명합니다 .


변화

imageView.setImageResource(R.drawable.drawable_image)

...에

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));

xml에서 vectordrawable을 사용하려면 다음을 사용하십시오.

app:srcCompat="@drawable/drawable_image"

오래 전에 비슷한 문제가 있었는데 설정으로 작동하지 않았습니다.

vectorDrawables.useSupportLibrary = true

"mipmap"폴더를 만들 때만 작동했고 코드는

imageView.setImageResource (R.mipmap.drawable_image)

여기에 더 많은 정보가 있습니다.


API 16 애니메이션
Drawable의 팽창

`VectorDrawable``AnimatedVectorDrawable`이 지원 라이브러리에서 다음 같이 확장 할 수 있습니다.

  • 정적 getDrawable()메서드 호출 :
// 이것은 루트 요소로 <vector>를 사용하여 드로어 블을 팽창시킵니다.
VectorDrawable.getDrawable (context, R.drawable.ic_arrow_vector);

// <animated-vector>를 루트 요소로 사용하여 드로어 블 만 팽창시킵니다.
AnimatedVectorDrawable.getDrawable (context, R.drawable.ic_arrow_to_menu_animated_vector);

// 이것은 모든 드로어 블을 팽창시키고 API 21+ 기기에서 롤리팝 구현으로 자동 폴백합니다.
ResourcesCompat.getDrawable (context, R.drawable.any_drawable);

자바 코드에서 그리기 확장하는을 ResourcesCompat.getDrawable()경우 해당되는 경우 롤리팝를 처리 대체 하므로 항상 사용하는 것이 좋습니다 . 이렇게하면 시스템이 Drawable ConstantState를 캐시 할 수 있으므로 더입니다.
라이브러리에는 다음과 같은 모프 (양방향) 애니메이션이 있습니다.

  • 재생-일시 중지 모프 애니메이션
  • 재생 중지 모프 애니메이션
  • Arrow-Hamburger 메뉴 모프 애니메이션

  • 보시다시피 위의 이미지를 API 16휴대 전화로 생성했습니다 .

    import com.wnafee.vector.compat.AnimatedVectorDrawable;
    mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
    

    여기 에 대한 github README참조하세요vector-compat : https://github.com/wnafee/vector-compat 앱 모듈 (일반적으로 파일 끝) 과 병합하면
    문제가 해결됩니다 ().API 14build.gradle dependencies

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector
        compile 'com.android.support:appcompat-v7:25.0.0'
        compile 'com.android.support:design:25.0.0'
    //not needed
    //  compile 'com.android.support:support-vector-drawable:25.0.0'
        compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat
    //  Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0
    //not needed
    //  compile 'com.android.support:support-animated-vector-drawable:25.0.0'
    }
    

    벡터를에 넣지 drawable-anydpi. 오래된 장치는이를 지원하지 않습니다.

    넣어 넣어 drawable


    내 특별한 경우에는 다음과 같이 선택기에서 여러 벡터가있는 이미지 리소스로 드로어 블 선택기를 사용했기 때문에이 문제가 발생했습니다.

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:drawable="@drawable/vector_select_blue"/>
        <item android:state_pressed="true" android:drawable="@drawable/vector_select_black"/>
        .
        .
        etc
    </selector>
    

    예, 꽤 나쁘지만 당시에는 더 잘 알지 못했습니다.

    따라서이 작업을 수행하는 올바른 방법은 다음과 같이 벡터 파일에서 tint 속성을 사용하는 것입니다.

    <vector ..vector properties..
            android:tint="@color/vector_color_selector">
                  <path ..path properties../>
    </vector>
    

    (AppCompatImageView에서 app : tint 속성을 사용할 수도 있습니다)

    이제 vector_color_selector 파일에 다음과 같이 원하는 색상이 있어야합니다.

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:color="@color/blue"/>
        <item android:state_pressed="true" android:color="@color/black"/>
        .
        .
        etc
    </selector>
    

    이전 답변이 효과가 없다면 도움이 되었기를 바랍니다. 명백한 것을 말하지만 그래도 gradle에서 vectorDrawables.useSupportLibrary = true를 설정하고 AppCompatImageView를 사용하고 app : srcCompat 또는 setImageDrawable + AppCompatResources.getDrawable을 사용하여 벡터 호환 라이브러리의 문제를 피해야한다고 말해야합니다.


    주석에서 Harish Gyanani가 말한 AppCompatImageView대신 사용하면 ImageView잘 작동합니다.

    공식 문서

    참고 URL : https://stackoverflow.com/questions/37615470/support-library-vectordrawable-resourcesnotfoundexception

    반응형