“? android : attr / activatedBackgroundIndicator”는 어떻게 작동합니까?


86

선택 항목에 대한 상황 별 작업 표시 줄을 표시 할 때 목록에서 선택한 항목을 강조 표시하는 방법을 찾고 있었는데 내가 찾은 해결책 android:background은 내 행 레이아웃 xml 의 속성을 "?android:attr/activatedBackgroundIndicator".

이 설정은 어떻게 작동합니까?

  1. 관련된 메커니즘은 무엇입니까?
  2. "?", "attr", "activatedBackgroundIndicator"와 같은 구문 요소는 무엇을 의미합니까?
  3. "activatedBackgroundIndicator"의 의미는 어디에 정의되어 있습니까?

답변:


221

당신이 법의학 분위기에 있다면 여기에서 무슨 일이 일어나고 있는지 파고 찾는 방법이 있습니다.

android:background="?android:attr/activatedBackgroundIndicator"?

직관적으로 이것은 배경을 드로어 블로 설정하는 것을 의미합니다.

그러나 이것을 더 분해하여 신비한 드로어 블에 도달하는 방법을 살펴 보겠습니다.

정확히 말하면 "배경 속성을"activatedBackgroundIndicator "속성 이 현재 테마에서 참조하는 것으로 설정하는 것을 의미합니다 .

"현재 주제에서 참조"부분을 이해했다면 기본적으로 커버 뒤에서 진행되는 모든 것을 이해 한 것입니다.

기본적으로 activateBackgroundIndicator는 실제 드로어 블이 아니라 드로어 블에 대한 참조 입니다. 그렇다면 "activateBackgroundIndictor"속성은 실제로 어디에 정의되어 있습니까?

파일 이름 attrs.xml 의 sdk 디렉토리에 정의되어 있습니다 . 예를 들면 :

path_to_android_sdk / platforms / android-17 / data / res / values ​​/ attrs.xml

해당 파일을 열면 다음과 같이 선언됩니다.

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xml은 나중에보기 xml에서 사용할 모든 속성을 선언하는 곳입니다. 우리는 속성과 그 유형을 선언하고 실제로 여기에 값을 할당하지 않습니다 .

실제 값은 themes.xml에 할당됩니다 . 이 파일은 다음 위치에 있습니다.

path_to_android_sdk / platforms / android-17 / data / res / values ​​/ themes.xml

해당 파일을 열면 사용중인 테마에 따라 여러 정의가 표시됩니다 . 예를 들어 다음은 테마 이름 Theme, Theme.Light, Theme.Holo, Theme.Holo.Light에 대한 정의입니다.

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>

이제 우리는 신비한 드로어 블을 가지고 있습니다. 첫 번째 항목을 선택하면 다음 위치의 드로어 블 폴더에 정의됩니다.

path_to_android_sdk / platforms / android-17 / data / res / drawable / activated_background.xml

해당 파일을 열면 무슨 일이 일어나고 있는지 이해하는 데 중요한 드로어 블의 정의가 표시됩니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
    <item android:drawable="@color/transparent" />
</selector>

여기서 우리는 두 가지 상태로 드로어 블을 정의합니다. 기본 상태는 투명한 배경이고 상태가 "state_activated"이면 드로어 블은 "list_selector_background_selected"입니다.

드로어 블 및 상태에 대한 배경 정보는 이 링크 를 참조하십시오 .

"list_selector_background_selected"는 drawable-hdpi 폴더에있는 9 패치 png 파일입니다.

이제 드로어 블 파일에 직접 연결하지 않고 ActivateBackgroundIndicator를 참조로 정의한 이유를 알 수 있습니다. 테마에 따라 올바른 드로어 블을 선택할 수 있습니다.


3
그들 모두를 지배하는 하나의 대답. 기본적으로 동일한 선택기로 XML을 만들려면 자신의 "activatedBackgroundIndicator"를 만들 수 있습니까?
Gee.E 2014

1
정확히-사용자 정의 theme.xml b / c 참조 속성에서 재정의 할 수 있습니다.
numan salati 2014

이 답변은 내 탐색 서랍 목록 항목에서 사용자 지정 드로어 블을 설정하는 방법을 알아내는 데 도움이되었습니다.
Tastybrownies 2014

selector드로어 블을 사용하여 사용자 지정 작업 을 시작하는 데 유용한 리소스입니다 . 이것을 읽은 후 Style Attribute Docs 를 사용하여 나머지 부분을 채웠습니다.
Maurizio 2014 년

1
이 배경 표시기를 재정의하는 방법에 대한 예를 제공 할 수 있습니까? 내 것이 작동하지 않습니다 : / <style name = "AppTheme"parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android : activatedBackgroundIndicator"> @ drawable / activated_background </ item> </ style> activate_background.xml : <selector xmlns : android = " schemas.android.com/apk/res/android "> <item android : state_activated = "true"android : drawable = "@ color / yellow"/> <item android : drawable = "@ 안드로이드 : 컬러 / 투명 "/> </ 선택>
vandus

13

나는 이것도 한때 궁금했다. 많은 양의 Android 리소스가 블랙 박스처럼 보이며 직접 볼 수 없습니다. 어딘가에서 누락되었을 수 있지만 SDK 소스 코드에서 찾을 수 없습니다. 여기 내가 아는 것이 있습니다.

  • android:background 드로어 블을 가져옵니다.
  • 구문은 스타일입니다.

    "@ [+] [package :] type : name"형식의 다른 리소스에 대한 참조이거나 "? [package :] [type :] name"형식의 테마 속성에 대한 참조 여야합니다.

이 경우 ?의미는 패키지의 테마를보고 android그리고 유형 인 attr이름입니다 activatedBackgroundIndicator.

코드 숨김에서도 액세스 할 수 있어야합니다 android.R.attr.activatedBackgroundIndicator.

Android attr속성 목록은 R.attr 에서 찾을 수 있습니다.

  • activatedBackgroundIndicator Android 3.0 이상에서 정의 된 드로어 블입니다.

    활성화 된 항목의 배경으로 사용되는 드로어 블입니다.

기본적으로 OS에 정의 된 표준 항목 일뿐입니다. Android 소스에서 찾을 수없는 것 같지만 여기에 문서 링크가 있습니다. enabledBackgroundIndicator


5

이것은 테마에서 값을 붙이는 형태입니다. 그 시점에서 테마 값을 알 수 없기 때문에 리소스 컴파일 중에 값을 기술적으로 알 수 없습니다. 대신 값은 (가장 일반적으로)에서 가져온 실제 테마를 기반으로 런타임에 확인됩니다 ContextThemeWrapper.

이것은 자원 값을 재사용하는 방법을 제공합니다. 여기서는 성능 측면에서 말하는 것이 아니라 조직 및 유지 관리 측면에서 말하고 있습니다. 속성은 런타임에 실제 값을 보유 할 것이라는 약속과 함께 변수처럼 작동합니다.

이 접근 방식은 또한 더 큰 사용자 정의를 허용합니다. 예를 들어 창 배경 드로어 블의 값을 하드 코딩하는 대신 테마에서 실제 드로어 블을 가져와 선택한 속성을 키로 제공합니다. 이렇게하면 해당 속성의 값을 재정의 할 있습니다. 다음이 필요합니다.

  1. 가장 일반적으로 기본 테마 중 하나에서 파생되는 고유 한 테마 ( "스타일"리소스의 멋진 이름)를 만듭니다.
  2. 해당 속성에 대한 고유 한 값을 제공하십시오.

플랫폼은 활동 또는 애플리케이션에 대한 테마를 지정한 경우 자동으로 값을 사용합니다. 질문에 설명 된대로 수행합니다. 테마 속성 참조의 일반 구문은 스타일 속성 참조에서 설명 합니다 . 또한 전체 메커니즘의 예와 설명을 찾을 수 있습니다.

편집하다

주목해야 할 한 가지는 실제 속성 이름과 다양한 플랫폼 버전에서의 존재입니다. 새로운 속성이 다음 플랫폼 버전에 도입되는 것은 매우 일반적입니다. 예를 들어, 일부는 ActionBar 스타일링을 위해 버전 3.0에 추가되었습니다.

속성 이름을 API의 일부로 취급해야합니다. 즉, 사용이 허용 된 계약의 일부입니다. 이것은 클래스 및 해당 서명과 매우 유사합니다 .이 클래스의 목적이 무엇인지 일부 소스 (튜토리얼, 참조, 공식 가이드 등) 에서 알고LocationManager 있기 때문에 마지막 장치 위치를 얻기 위해 클래스를 사용 합니다. 마찬가지로 속성 이름과 그 목적은 Android 플랫폼 문서에 정의되어 있습니다 (때로는 잘, 때로는 비참하게).


2

업데이트 : API 가이드에서 더 자세한 버전을 사용할 수 있으므로 인용하고 싶습니다.

스타일 속성 리소스를 사용하면 현재 적용된 테마의 속성 값을 참조 할 수 있습니다. 스타일 속성을 참조하면 하드 코딩 된 값을 제공하는 대신 현재 테마에서 제공하는 표준 변형과 일치하도록 스타일을 지정하여 UI 요소의 모양을 사용자 정의 할 수 있습니다. 스타일 속성을 참조하면 기본적으로 "현재 테마에서이 속성으로 정의 된 스타일을 사용하십시오."라고 말합니다.

스타일 속성을 참조하기 위해 이름 구문은 일반 리소스 형식과 거의 동일하지만 at 기호 (@) 대신 물음표 (?)를 사용하고 리소스 유형 부분은 선택 사항입니다. 예 :`

원래 답변 :

누만 살라 티는 이미 완벽한 대답을 제공했지만 "?"는 언급하지 않았습니다. 통사론. 다음은 API 가이드 리소스 액세스 의 인용문입니다.

스타일 속성을 참조하기 위해 이름 구문은 일반 리소스 형식과 거의 동일하지만 at 기호 (@) 대신 물음표 (?)를 사용하고 리소스 유형 부분은 선택 사항입니다. 예를 들면 :

? [<패키지 _ 이름> :] [<리소스 _ 유형> /] <리소스 _ 이름>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.