2016-09-14 3 views
0

Android 앱에서 작업 중이며 API 19 이상을 지원해야합니다. 그래서 내 스타일 구조는 다음과 같습니다 styles.xml에서다른 한정자와 함께 Android 스타일 상속을 사용하는 방법

res 
    values 
      styles.xml 
    values-v21 
      styles.xml 

나는

<style name="customButton" parent="Base.Widget.AppCompat.Button"> 
    <item name="android:focusable">false</item> 
    <item name="android:clickable">true</item> 
</style> 

이 있고 v21/styles.xml에 나는이 작동하지만, 잘 보이지 않는다

<style name="customButton" parent="customButton"> 
    <item name="android:elevation">10dp</item> 
</style> 

있습니다. 그리고 안드로이드 스튜디오는 순환 참조에 대해 불평하고있다. 이는 v21/customButton이 기술적으로 자체적으로 상위 항목이기 때문입니다.

v21/customButton의 이름을 customButton21으로 바꿀 수 없습니다.이 스타일을 사용하는 모든 버전의 두 가지 버전을 만들어야하기 때문입니다. 차이점은 API 21에 추가 된 새로운 속성입니다.

이 문제를 해결하기위한 올바른 방법은 무엇입니까? 어쩌면 base-style.xml을 만든 다음 특정 API 스타일로 참조 할 수 있습니까?

PS :이 질문은 API뿐만 아니라 모든 한정자에 적용됩니다.

답변

0

나는 다음과 같은 솔루션을 정착 :

attrs.xml이

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <attr name="buttonStyle" format="reference" /> 
</resources> 

값/styles.xml

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="@attr/buttonStyle">@style/buttonStyleBase</item> 
    </style> 

    <style name="buttonStyleBase"> 
     <item name="android:gravity">left</item> 
     <item name="android:textSize">20sp</item> 
    </style> 
</resources> 

값-V21/styles.xml

<resources> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <item name="@attr/buttonStyle">@style/buttonStyle21</item> 
    </style> 

    <style name="buttonStyle21" parent="buttonStyleBase"> 
     <item name="android:elevation">15dp</item> 
    </style> 
</resources> 

그리고 그것을 사용하십시오 :

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     style="?attr/buttonStyle" /> 

이렇게하면 필요한만큼 복잡한 기본 스타일을 상속하고 다른 SDK 버전과 관련된 변경 사항 만 적용 할 수 있습니다.