IT 프로그래밍-Android

DrawerLayout, NavigationView 사용 시 주의사항

godsangin 2020. 4. 1. 21:44
반응형

메뉴 기능을 구현하기 위해 주로 사용하는 DrawerLayout과 NavigationView를 사용하는 경우가 많습니다. 이번에 기능 구현을 하면서 겪은 이슈와 해결방법에 대해서 정리해봅니다.

 

- onOptionsItemSelected vs OnNavigationItemSelectedListener

 주로 ToolBar를 통해 DrawerLayout을 open하는 경우가 많습니다. 그래서 처음에는 onOptionsItemSelected메소드에서 navigation의 menu item 클릭 이벤트를 처리하는 것이라고 생각했습니다. 하지만 NavigationView에는 따로 OnNavigationItemSelectedListener가 존재하기 때문에 navigationView에서 setNavigationItemSelectedListener로 커스텀한 OnNavigationItemSelectedListener를 달아주어야합니다.(onOptionsItemSelected메소드와는 무관합니다.)

 

- ConstraintLayout 사용 시 주의사항

 저는 이 부분에서 많이 헤매게 되었습니다.. ConstraintLayout 사용 시(match parent를 사용하는 경우) NavigationView의 뷰 레벨에 대한 문제였는데요.. NavigationView를 클릭할 경우 바로 close되어버리거나

"java.lang.IllegalArgumentException No drawer view found with gravity RIGHT(or Left)"

이러한 문제가 발생하였다면 뷰 레벨의 문제일 가능성이 높습니다.

 첫번째로 NavigationView는 DrawerLayout의 바로 하위 레벨에 존재해야합니다. 아래와 같은 뷰 구조를 만들었다면 위의 Exception을 만나게 됩니다...

 

잘못된 예1)

<DrawerLayout>

    ...

    <ConstraintLayout>

    ...

      <NavigationView/>

    </ConstraintLayout>
</DrawerLayout>

 두번째로 ConstraintLayout 사용 시 NavigationView가 같은 레벨의 다음 태그로 존재해야합니다. 아래의 경우에는 NavigationView를 클릭할 수 없는 문제가 발생하게 됩니다.

 

잘못된 예2)

<DrawerLayout>

    ...
    
    <NavigationView/>
     
    <ConstraintLayout>
    
    ...
    
    </ConstraintLayout>
</DrawerLayout>

 이를 계기로 같은 레벨의 태그라면 더 나중에 정의된 태그가 우선시되어 뷰의 상위에 존재한다는 것을 알 수 있었습니다. DrawerLayout과 NavigationView를 사용할 경우 아래와 같은 뷰 트리를 작성하도록 합시다 !!

<DrawerLayout>

    ...
     
    <ConstraintLayout><!--or something otherView(ex Linear, Relative)-->
    
    ...
    
    </ConstraintLayout>
    <NavigationView/>
</DrawerLayout>

검색을 해봐도 이유를 찾을 수가 없었는데 사소한 뷰 트리의 문제였다는 것을 알고 정말 맥이 빠져버렸습니다...혹시 저와 같은 문제를 겪고 있으셨다면 도움이 되시길 바랍니다.