IT story

드로어 블에서 스타일 속성을 참조하는 방법은 무엇입니까?

hot-time 2020. 9. 11. 19:42
반응형

드로어 블에서 스타일 속성을 참조하는 방법은 무엇입니까?


내 응용 프로그램에 대해 2 개의 선택 가능한 테마를 갖고 싶습니다. 이를 위해 다음과 같은 몇 가지 속성을 정의했습니다.

 <attr format="color" name="item_background" />

그런 다음 다음과 같이 두 테마를 모두 만들었습니다.

  <style name="ThemeA">
     <item name="item_background">#123456</item>
 </style>

 <style name="ThemeB">
     <item name="item_background">#ABCDEF</item>
 </style>

이 방법은 훌륭하게 작동하여 여러 테마를 쉽게 만들고 수정할 수 있습니다. 문제는 드로어 블이 아닌 뷰에서만 사용할 수 있다는 것입니다 .

예를 들어 레이아웃 내에서보기의 값을 참조하면 다음과 같이 작동합니다.

 <TextView android:background="?item_background" />

하지만 드로어 블에서 똑같이하는 것은 다음과 같습니다.

 <shape android:shape="rectangle">
     <solid android:color="?item_background" />
 </shape>

응용 프로그램을 실행할 때이 오류가 발생합니다.

    java.lang.UnsupportedOperationException: Can't convert to color: type=0x2

?item_background하드 코딩 된 색상을 사용하는 대신 작동하지만 내 테마를 사용할 수 없습니다. 나는 또한 시도 ?attr:item_background했지만 같은 일이 발생합니다.

어떻게 할 수 있습니까? 뷰에서는 작동하지만 드로어 블에서는 작동하지 않는 이유는 무엇입니까? 문서 에서이 제한을 찾을 수 없습니다 ...


내 경험상 xml 드로어 블의 속성을 참조하는 것은 불가능합니다.
테마를 만들려면 다음이 필요합니다.

  • 테마 당 하나의 xml 드로어 블을 만듭니다.
  • @color태그 또는 #RGB 형식을 사용 하여 필요한 색상을 드로어 블에 직접 포함 합니다.

attrs.xml 에서 드로어 블에 대한 속성을 만드십시오 .

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <!-- Attributes must be lowercase as we want to use them for drawables -->
   <attr name="my_drawable" format="reference" />
</resources>

드로어 블을 theme.xml에 추가하십시오 .

<style name="MyTheme" parent="@android:style/Theme.NoTitleBar">
   <item name="my_drawable">@drawable/my_drawable</item>
</style>

속성을 사용하여 레이아웃에서 드로어 블을 참조하십시오.

<TextView android:background="?my_drawable" />

시작 lollipop이 기능이 지원됩니다 (API 21)을 참조 https://code.google.com/p/android/issues/detail?id=26251

However, if you're targeting devices without lollipop, don't use it, as it will crash, use the workaround in the accepted answer instead.


Although it's not possible to reference style attributes from drawables on pre-Lollipop devices, but it's possible for color state lists. You can use AppCompatResources.getColorStateList(Context context, int resId) method from Android Support Library. The downside is that you will have to set those color state lists programmatically.

Here is a very basic example.

color/my_color_state.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_checked="true" android:color="?colorControlActivated" />
  <item android:color="?colorControlNormal" />
</selector>

A widget that needs a color state list:

<RadioButton
  android:id="@+id/radio_button"
  android:text="My Radio" />

And the most important:

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_color_state);    
RadioButton r = (RadioButton) findViewById(R.id.radio_button);
r.setTextColor(csl);

Well, not the most elegant or shortest way, but this is what Android Support Library does to make it work on older versions (pre-Lollipop) of Android.

Unfortunately, the similar method for drawables doesn't work with style attributes.


As @marmor stated this is now supported on API 21. But for those us who need to support legacy versions of Android, you can use this feature. Using the v7 support library you can still use it on apps with minimum SDK level all the way down to 7.

The AppCompatImageView in the v7 Android Support Library has a bug free implementation of this feature. Simply replace your usages of ImageView with AppCompatImageView.

참고URL : https://stackoverflow.com/questions/8041537/how-to-reference-style-attributes-from-a-drawable

반응형