지원 라이브러리 VectorDrawable 리소스 $ NotFoundException
Design Support Library 버전 23.4.0을 사용하고 있습니다. gradle 플래그를 활성화했습니다.
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
빌드 도구 버전 23.0.2를 사용 하고 여전히 Resources$NotFoundException
KitKat 이하를 사용하고 있습니다.
android:drawableLeft
또는 사용할 때 발생 imageView.setImageResource(R.drawable.drawable_image)
합니다.
그리고 예, 드로어 블을 사용하는 모든 활동에 적용하고 있습니다.
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
지원 라이브러리의 버그입니까?
지원 라이브러리 23.4.0을 사용하여이를 수행 할 세 가지 별도의 작업이 필요했습니다.
빌드 .gradle에 추가하십시오.
defaultConfig { vectorDrawables.useSupportLibrary = true }
애플리케이션 클래스의 onCreate에 다음을 추가하십시오.
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
벡터 드로어 블 교체를 설정하는 모든 xml보기의 경우
android:src
와
app:srcCompat
코드에서 다음을 바꿉니다.
imageView.setImageResource(...);
와
imageView.setImageDrawable(...);
여기에 대한 답변 중 일부를 보완 하기 위해 VectorDrawables에 대한 이전 버전과 호환되는 지원에는 가격이 제공되며 모든 경우에 작동하지 않습니다 .
어떤 경우에 작동합니까? 도움 이 유효하도록 이 다이어그램 을 만들었습니다 (지원 라이브러리 23.4.0에서 최소 25.1.0까지 함).
다음을 사용합니다.
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에서 이것을 사용하십시오.
그런 다음 AppCompatDrawableManager
setDrawable 및 getDrawable에 사용하십시오. 나를 위해 작동
같은 장소에서 벡터 드로어 블에 대한 지원 android:drawableLeft
은 지원 라이브러리 23.3에서 벡터 드로어. Google+ 에서 발표되었습니다 .
버전 23.2.0 / 23.2.1의 구현에서 발견 된 문제로 인해 롤리팝 이전 기기의 리소스에서 벡터 드로어 블을 사용할 수있는 기능을 제거하기로 결정했습니다. app : srcCompat 및 setImageResource () 사용은 계속 작동합니다.
문제에 대한 링크 :
- https://code.google.com/p/android/issues/detail?id=205236
- https://code.google.com/p/android/issues/detail?id=204708
그러나 이러한 문제를 해결할 수 있다면 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)
여기에 더 많은 정보가 있습니다.
`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를 캐시 할 수 있으므로 더입니다.
라이브러리에는 다음과 같은 모프 (양방향) 애니메이션이 있습니다.
보시다시피 위의 이미지를
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 14
build.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
잘 작동합니다.
'ProgramingTip' 카테고리의 다른 글
Rails + New Relic : RPM은 무엇을 의미합니까? (0) | 2020.11.09 |
---|---|
Guzzle에서 예외 잡기 (0) | 2020.11.09 |
Python- 루프 내부의 이전 및 다음 값 (0) | 2020.11.09 |
용어에서 문자 범위 (0) | 2020.11.09 |
Android : 사용자의 언어로 현재 요일 (월요일 등)을 가져 오는 방법은 무엇입니까? (0) | 2020.11.09 |