'앱'Android XML 네임 스페이스 란 무엇입니까?


164

다음은 파일 app에서 본 네임 스페이스 의 예입니다.res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="100"
    app:showAsAction="never" />
</menu>

app네임 스페이스 는 어떤 용도로 사용됩니까? "표준"Android XML 네임 스페이스입니까? 서로 다른 두 네임 스페이스 (예 : app:showAsActionandroid:showAsAction) 에 동일한 속성에 대해 동일한 값 옵션을 사용할 수 있습니까?

로부터 문서 : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

즉, 위 예제의 줄은 속성이 대신에 다른 것을 의미합니까?

android:showAsAction="never"

일종의 "서브 클래 싱"메커니즘 인 것 같지만 appGoogle / Android 소스에서 네임 스페이스 에 대한 실제 문서를 찾을 수없는 것 같습니다 .

답변:


213

app네임 스페이스는 도서관에 국한되지이지만 여부를 효과적으로 속성 정의에 대해 하나의 글로벌 네임 스페이스를 만드는 가져올 코드 또는 라이브러리가 앱에 정의 된 모든 속성에 사용됩니다 - 즉, 안드로이드 시스템에 의해 정의되지 않은 속성 .

이 경우 appcompat-v7라이브러리는 android:네임 스페이스를 미러링하는 사용자 정의 속성을 사용 하여 이전 버전의 Android를 지원합니다 (예 : android:showAsActionAPI11에서만 추가되었지만 app:showAsAction(응용 프로그램의 일부로 제공됨)는 앱이 수행하는 모든 API 레벨에서 작동 함). (가) 사용하여 android:showAsAction그 속성이 정의되어 있지 않은 경우 API 수준에서 작동하지 않을 것입니다.


1
감사합니다! 나는 문서에서 이것에 대한 언급을 마침내 발견하게되어 기쁘다. 그러나 하나의 후속 질문. 링크의 작업 표시 줄 문서에 "위의 showAsAction 속성은 <menu> 태그에 정의 된 사용자 정의 네임 스페이스를 사용합니다. 지원 라이브러리에서 정의한 XML 속성을 사용할 때 필요합니다. 이전 기기의 Android 프레임 워크이므로 지원 라이브러리에서 정의한 모든 속성의 접두사로 고유 한 네임 스페이스를 사용해야합니다. "
coder123

1
그렇다면 프레임 워크에 속성이없는 구형 장치에서는 어떤 일이 발생합니까? 사용자 지정 네임 스페이스를 정의하면 속성에 대한 지원이없는 경우 어떻게 작동하는지 아직 명확하지 않습니다. showAsAction사용자 정의 네임 스페이스로 선언 한다는 것은 새로운 플랫폼에서 예상대로 작동하고 이전 플랫폼에서는 무시됨을 의미합니까?
coder123

4
존재하지 않는 속성은 자동으로 무시됩니다. 사용자 지정 특성을 만들면 사용자 지정 특성이 런타임에 존재한다는 것을 보장합니다 (분명히 해당 정의가 앱에 포함됨). 따라서 지원 라이브러리는 사용자 정의 속성을 사용하여 메뉴를 빌드하기위한 사용자 정의 코드가 모든 API 버전에서 작동하는 단일 코드 경로를 사용할 수 있으므로 android:버전 을 사용할 필요가 없습니다 .
ianhanniballake

2
나는 그것을 얻지 못해서 미안하다. 네임 스페이스를 간단히 변경하여 속성에 대한 정의를 제공하는 방법을 이해하도록 도와 줄 수 있습니까? 경우 showAsName속성이 이전 라이브러리에서 지원되지 않습니다, 어떻게 플랫폼이 가능한 값 옵션 (의 범위를 알 수 있도록 네임 스페이스 정의를 사용하여 않는 ifRoom, never등), 그 옵션을 해석하는 방법을 알아? "존재하지 않는 속성"은 라이브러리에 구현이없는 속성을 의미한다고 가정합니다. 스와핑 android:에 대한 app:거의 것은 완전한 해결 방법처럼 보인다. 뭔가 빠졌습니까?
coder123

14
여기에는 두 가지 부분이 있습니다. 1) 사용자 정의 속성 ( app:showAsName) 및 가능한 모든 값 appcompat-v7 라이브러리 ( attrs.xml파일에 정의) 를 포함 할 때 앱에 포함됩니다 . 2) AppCompat 라이브러리 (특히, 사용할 때 자동으로 사용되는 ActionMenuViewActionBarActivity )가 분석 app:showAsAction되어 모든 API 레벨에서 동일한 방식으로 항목을 올바르게 표시합니다. 확실히 작동하려면 XML과 코드가 모두 필요합니다.
ianhanniballake

0

이 링크에서 설명을 얻을 수 있습니다

XML 네임 스페이스

네임 스페이스 선언 XML 네임 스페이스는 예약 된 XML 속성 xmlns 또는 xmlns : prefix를 사용하여 선언되며 값은 유효한 네임 스페이스 이름이어야합니다.

예를 들어 다음 선언은 "xhtml :"접두사를 XHTML 네임 스페이스에 매핑합니다.

xmlns : xhtml = "http://www.w3.org/1999/xhtml"

접두사 "xhtml :"로 시작하는 이름을 가진 요소 나 속성은 XHTML 네임 스페이스에있는 것으로 간주됩니다.

기본 네임 스페이스를 선언 할 수도 있습니다. 예를 들면 다음과 같습니다.

xmlns = "http://www.w3.org/1999/xhtml"

이 경우 네임 스페이스 접두어가없는 요소는 XHTML 네임 스페이스에있는 것으로 간주됩니다 (조상 또는 위의 기본 네임 스페이스 선언이있는 경우).

범위에 기본 네임 스페이스 선언이 없으면 네임 스페이스 이름에 값이 없습니다. [6] 이 경우 명시적인 네임 스페이스 접두사가없는 요소는 네임 스페이스에없는 것으로 간주됩니다.

속성에는 기본 네임 스페이스가 적용되지 않습니다. 명시적인 네임 스페이스 접두사가없는 속성은 네임 스페이스에없는 것으로 간주됩니다.

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