안드로이드 개발 팁 블로그

android api20 이하에서 verctor Tint 사용하기 정리 본문

Android Tip

android api20 이하에서 verctor Tint 사용하기 정리

tiii 2018. 7. 22. 12:59
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

회사 안드로이드 코드를 리팩토링하면서 layout 과 source codeAppCompatImageView로 떡칠되어 있는 이유에 대해 고민 하던 중 

4.x에서 ImageView를 사용하고 tint를 selector와 사용했을 경우 앱이 강제 종료 당한다라는 말이 있어 정리해 보았다.


우선 AppCompatImageView에 대해 살펴보면 

This will automatically be used when you use ImageView in your layouts and the top-level activity / dialog is provided by appcompat. You should only need to manually use this class when writing custom views.

 link - document

문서에 따르면 엑티비티나 다이얼로그가 appcompat에 의해 제공됐을 경우 ImageView를 사용했을 경우 자동으로 변환되며 이 클래스를 사용하여 커스텀 뷰를 작성했을 때에만 필요하다고 쓰여 있다.



테스트를 위해 상단의 TextView를 클릭하면 이미지의 selected를 값을 변경해 주는 간단한 샘플코드를 작성하였다.

별다른 설정 없이 새로운 프로젝트를 생성 후 바로 작성하였다.

API 26 - 정상작동




API 19 - RuntimeException으로 사망

에러코드를 살펴 보자,

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shine.~.MainActivity}:
android.view.InflateException: Binary XML file line #21: Error inflating class ImageView

ImageView에 뭔가 잘못됐다라는 사실을 알 수 있다.

Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class ImageView

Caused by: java.lang.NumberFormatException: Invalid int: "res/drawable/selector.xml"



이제 API 20 이하에서 Vector를 사용하도록 바꿔보자.


API 20 이하의 디바이스에서 Vector 이미지를 사용하기 위해서는 

1. build.gradle에 설정을 추가해야한다.

defaultConfig {

vectorDrawables.useSupportLibrary true

}



2. layout 코드에서 android:src 속성을 app:srcCompat으로 변경해준다.

3. tint를 사용할 경우 android:tint 를 app:tint로 변경 해준다.



<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:clickable="true"
android:contentDescription="@string/test"
android:focusable="true"
app:srcCompat="@drawable/ic_android_black_24dp"
app:tint="@drawable/selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
/>

컴파일!


API19에서 작동이 잘 된다.

API20 이하 디바이스에서 Vector이미지를 사용할 때 src 속성을 변경하라는 

lint 가이드를 제공해주는 반면에 다른 속성에 대해서는 lint가이드가 빠져 있으니 도큐먼트를 잘 읽고 속성값을 바꿔주면 되겠다.


실험 : AppCompatActivity을 상속받지 않고 Activity 상속 받아 실행

android:src 속성 값일 경우 api 19 에서 앱 사망.

app:srcCompat 속성 값일 경우 앱은 죽지 않으나 이미지 표시 안됨.




Comments