No resource identifier found for attribute 'layout_behavior' in package

2016. 12. 13. 12:41


1. Layout의 Behavior

안드로이드 스튜디오에서 프로젝트를 생성할 때 기본적으로 생성되는 액티비티 종류를 "Basic Activity"로 선택하면, 아래의 그림과 같이 "layout_behavior" 속성이 액티비티의 레이아웃 리소스 XML 파일에 자동으로 추가됩니다.

Basic Activity 선택 시, layout_behavior 속성 추가


Layout 클래스(또는 Layout의 하위 클래스)에 있어서 Behavior라고 하는 것은, 사용자가 화면에서 어떠한 입력 행동(드래그 또는 스와이프(Swipe)같은 제스쳐)을 수행했을 때, Layout 클래스와 그 하위 뷰들이 어떻게 상호작용(interaction)할 것인지를 구현한 것을 말합니다.


예를 들어, 레이아웃에서 스크롤 기능이 수행될 때, Floating Action Button이 스크롤 액션에 따라 자동으로 화면에 표시되거나 사라진다거나, 또는 AppBar Layout의 영역이 늘어나거나 줄어드는 경우가 바로 Behavior의 역할이죠.


이는 개발자가 사용자의 스크롤 액션에 따른 애니메이션을 직접 구현하지 않아도, 미리 구현되어 있는 Behavior를 사용할 수 있게 해줌으로써, 안드로이드의 일관된 UX를 적용할 수 있게 만들어줍니다.

2. "layout_behavior" 속성에 대한 지원.

"layout_behavior" 속성이 추가된 것은 안드로이드 5.0 Lollipop에서 머티리얼 디자인(Meterial Deisign)이 적용되었을 때부터입니다. 머티리얼 디자인을 지원하기 위해 추가된, 디자인 서포트 라이브러리(Design Support Library)에 "layout_behavior" 속성이 정의되어 있죠.


그래서 "layout_behavior" 속성을 사용하려면, 안드로이드 프로젝트에 디자인 서포트 라이브러리(Design Support Library)에 대한 Dependency가 추가되어 있어야 합니다.


디자인 서포트 라이브러리에 대한 Dependency는 프로젝트의 "build.gradle" 파일에 추가합니다. (마지막 숫자들은 라이브러리의 버전을 뜻합니다.)
    compile 'com.android.support:design:24.1.1'

3. 문제 상황. (No resource identifier found for attribute layout_behavior in package XXX)

안드로이드 프로젝트를 만들 때 "Empty Activity"를 선택하면, "Basic Activity"와 달리, 액티비티의 레이아웃 속성에 "layout_behavior"가 자동으로 추가되지 않습니다. 그에 따라 "build.gradle(Module: app)" 파일에도 디자인 서포트 라이브러리에 대한 Dependency가 존재하지 않죠.


그런데 이 상황에서, 액티비티의 레이아웃 속성에 "layout_behavior"를 사용하면 다음과 같은 에러 메시지가 표시됩니다.

No resource identifier found for attribute layout_behavior in... error


Error:(2) No resource identifier found for attribute 'layout_behavior' in package 'com.recipes4dev.examples.customlistview2ndtest'
Error:(11, 26) No resource found that matches the given name (at 'layout_behavior' with value '@string/appbar_scrolling_view_behavior').


만약 "layout_behavior"로 인해 "Namespace 'app' is not bound..." 에러가 표시된다면, 레이아웃의 속성에 "xmlns:app="http://schemas.android.com/apk/res-auto"" 를 추가해주세요.)

4. 해결 방법.

지금까지 기술한 내용을 읽어보시면 아시겠지만, 해결 방법은 간단합니다. "layout_behavior" 속성을 사용하지 않던지, 사용한다면 그에 따른 설정을 추가해주면 되죠.

4.1 "layout_behavior" 속성 삭제.

"layout_behavior" 속성 사용이 앱의 UX에 영향을 미치지 않는다면, 속성이 사용된 줄을 그냥 지우셔도 됩니다. 그러면 에러가 사라질 것입니다.

4.2 디자인 서포트 라이브러리 (Design Support Library) 추가.

"layout_behavior" 속성을 무조건 사용해야 한다면, 이제 그에 따른 설정을 추가해줘야겠죠. 위에서 설명했듯이, "layout_behavior" 속성을 사용하기 위해서는 디자인 서포트 라이브러리에 대한 Dependency가 프로젝트에 추가되어 있어야 합니다. 이는 프로젝트의 "build.gradle (Module: app)" 파일에 작성됩니다.


"build.gradle" 파일에 아래의 내용을 추가해 주세요. 이 때 라이브러리 버전은 AppCompat-v7의 버전(24.1.1)과 동일하게 사용하시면 됩니다.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:design:24.1.1'
}

그리고 "build.gradle" 파일을 수정하고나면, Gradle build 과정을 다시 수행하기 위해 Gradle Sync를 해줘야 합니다. Gradle Sync기능은 "build.gradle" 파일이 수정 및 저장되는 순간, 안드로이드 스튜디오의 소스 편집 화면의 상단에 표시되는 윈도우에서 "Sync Now" 버튼을 클릭하여 수행할 수 있습니다.

Gradle Sync Now


4.3 "Project Structure" 메뉴를 통한 Dependency 추가.

"build.gradle" 파일을 직접 편집하고 Gradle Sync 과정이 뭔가 꺼림직하다면, "Project Structure"의 app Modules 설정 관리를 통해 Dependency를 지정할 수 있습니다. (물론 Dependency를 삭제하는 것도 가능합니다.)


안드로이드 스튜디오에서 File - Project Structure 메뉴를 선택한 다음, 다이얼로그의 메뉴 선택화면에서 app - Dependency 탭을 선택합니다.

Project Structure 다이얼로그 실행


여기서 보여지는 항목들이 "build.gradle" 파일의 "dependencies" 목록에 표시된 내용입니다. 오른쪽의 "+" 버튼을 누른 다음, "Library dependency" 메뉴를 선택합니다.

Library Dependency 추가


실행된 "Choose Library Dependency" 다이얼로그에는 현재 안드로이드 스튜디오에 설치된 라이브러리 목록이 표시되며, "design (com.android.support:design:x.x.x)"로 표시되는 라이브러리를 선택한 다음, "OK" 버튼을 선택합니다.

Choose Library Dependency 다이얼로그


그리고 "Project Structure" 다이얼로그의 "Dependencies" 내용을 보면, 디자인 서포트 라이브러리 항목이 추가된 것을 확인할 수 있습니다.

library dependency 확인


마지막으로 "OK" 버튼을 누르면 "Gradle Sync"가 수행되고, "build.gradle" 파일에 디자인 서포트 라이브러리 항목이 추가된 것을 확인할 수 있습니다.

추가된 디자인 서포트 라이브러리 확인


AAA

4. 참고

.END.


ANDROID 스튜디오/문제 해결