마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Navigation Drawer의 액션바에 관한 질문좀 드리겠습니다.

0 추천

 

안녕하세요 네비게이션 드로우에서 우측상단 overflow 메뉴의 아이콘을 바꾸다가 테마에 관해 궁금한점이 있어 질문좀 드립니다. 해당 앱의 Navigation Drawer 액티비티는 처음부터 제가 제작한게 아닌

기존 안드로이드에서 제공하는 Navigation Drawer액티비로 만들어 제가 수정해 나간것입니다.

현재 테마들이 정의 되어있는 style.xml입니다

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <item name="android:src">@drawable/order_small</item>
    </style>
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
        <item name="android:src">@drawable/order_small</item>
    </style>

    <!-- 우측상단 overflow 메뉴 아이콘 변경   -->
    <style name="MyActionButtonOverflow" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
        <item name="android:src">@drawable/order_small</item>
    </style>
</resources>

현재 매니페스트입니다

보시면 style.xml에서 Apptheme은 NoActionBar를 설정하여 기본으로 나타나는 액션바는 없애준 상태이고

내비게이션 드로어의 액션바 코드입니다.

내비게이션 드로어 액티비티를 만들면서 생성된 이러한 액션바 코드를 사용중입니다.

위 코드를 보시면 Appbar와 Toolbar 는 테마가 각각 

@style/AppTheme.AppBarOverlay

@style/AppTheme.PopupOverlay

로 정의되어 있습니다.

그래서 제가 overflow 메뉴 아이콘을 바꾸기 위해 style에 들어가서 해당 테마사이에 

아이콘을 바꾸기 위한 아이템을 추가 했습니다. 당연히 아이콘은 성공적으로 바뀌었는데 호기심에

기존 아이템은 지우고 Apptheme에다가 해당 아이템을 추가하니 그래도 보였습니다.

 

이해가 잘가질 않습니다. Apptheme은 NoActionBar로 설정되어있어 기존 액션바는 보이지않고 

내비게이션 드로어에 정의되어있는 액션바가 보여야할텐데, 아이템을 Apptheme에만 설정해주어도

왜 아이콘이 바뀐 그대로 보이는지 잘이해가 가질 않습니다. Apptheme은 NoActionBar이기 때문에

아무리 아이템을 적용하여도 기존 액션바가 보이지 말아야하기때문에 안보여야하는것 아닌가요?

매니페스트보시면 application에서 테마가 Apptheme으로 되어있기는하지만 Apptheme은 NoActionBar로

설정되어있어 안보여야할텐데 이해가 안갑니다.

그리고 또 혹시나 해서 내비게이션 드로어 액션바 정의코드에서 해당 테마들을

둘다 Apptheme으로 바꾸어보았습니다 액션바가 사라지는것을 보려구요.근데

사진과 같이 상단에 액션바가 그대로 보입니다.

DrawerLayout 내에 Appbarlayout과 Toolbar의 테마를 둘다 Apptheme으로 설정해줬는데도 왜

액션바가 완전히 사라지지 않는건가요?

 

그래서 질문정리와 추가적인 질문을 적어보자면

1.매니페스트의 application테마가 NoActionBar로 설정되어있는 테마라 액션바가 보이지 않아야할텐데     이 테마에 아이템을 추가해줬을시에 아이템이 그대로 보이는지?

 

2.DrawerLayout내의 AppbarLayout과 Toolbar 의 테마를 Apptheme로 바꾸어도 왜 NoActionBar가 적용되지 않는지?

 

3. 위 두개의 이유가 혹시 DrawerLayout 때문인지? 이 한개가 자체적으로 내비게이션 드로어의 액션바같은것을 보여주게하는 무엇인가가 있는지?

 

4.AppbarLayout의 테마 AppTheme.AppBarOverlay와 Toolbar의 테마 AppTheme.PopupOverlay 이 두개는무엇을 의미하는지..?

 

답변해주시면 정말 감사하겠습니다!

codeslave (3,940 포인트) 님이 2020년 12월 13일 질문
디자이너정님 말씀처럼, 안드로이드에서 제공해준 툴바를 그대로 사용하지 않고 님의 레이아웃에 정의된 툴바를 사용하기 위해 Theme이 NoActionBar로 하신 거구요. 이말은 님의 레이아웃에 툴바로 별도로 정의되어있고 액티비티에서 setSupportActionBar를 호출해서 툴바를 세팅해주고 있는거죠.
감사합니다 선생님 그럼 Apptheme이 NoActionBar로 되어있고  툴바의 아이콘을 바꿔주는 아이콘을 바꿔주는 style을 추가했잖아요? 근데 Apptheme을 적용해도 아이콘이 바뀐 툴바가 보이는 현상을 질문드렸고...
그럼 이게 Apptheme이 액션바를 완전히 없애는게 아니라 아이콘을 바꾸는 style을 적용시켰으니까 아이콘은 그대로 남아있는 상태에서 기존의 액션바만 없어지고 제가 지정한 toolbar위에 덧붙여 보이는건가요?
아래 댓글에 답변가능하시변 부탁드리곘습니다ㅜ

1개의 답변

0 추천

액션바가 완전히 사라지지 않는건가요?

 -> Toolbar에 background를 투명속성으로 바꿔보세요.

 

1. 액션바가 보이지 않아야할텐데

 -> XML에 Toolbar직접 정의해서 action bar가 보이게 됩니다.

 

2. 왜 NoActionBar가 적용되지 않는지?

  -> 적용된 것입니다. 1번 이유로 action bar가 보이는 것 입니다.

 

3.  내비게이션 드로어의 액션바같은것

 -> 이게 무언지...?

 

4. 4.AppbarLayout의 테마 AppTheme.AppBarOverlay와 Toolbar의 테마 AppTheme.PopupOverlay 이 두개는 무엇을 의미하는지..?

 -> theme은 보통 activity에 적용하는 게 맞습니다. 기존 구현이 잘못 사용하고 있는것 같네요.

    theme을 view에 바로 지정해서 사용하는 경우는 흔치 않습니다.

 

디자이너정 (42,810 포인트) 님이 2020년 12월 13일 답변
선생님 감사합니다.
그런데 매니페스트의 application에 현재 Apptheme이 적용되어있는데,
본문에도 적어놨지만 우측상단 overflow menu의 아이콘을 바꾸고싶어서
Apptheme에다가 아이콘을 바꾸는 style을 추가했는데 그래도 보이는 이유는
Apptheme은 액션바는 없애주지만 style은 그대로 보여주나요?
Noactionbar라는게 완전하게 없애주는게 아닌건가요?
그럼 현재 진짜로 보여지는 액션바는 Apptheme의 베이스 액션바가아니라
Apptheme으로 인해 바뀐 style태그 + 제가 정의한 ActionBar 이 두개가 합쳐진건가요
Theme의 적용은 theme 파일에 정의된 것부터 적용이 되지만, 레이아웃 xml에 정의된 것이 있다면,  이게 우선권이 있습니다. 님이 툴바를 안보이게 했더라도,  새로운 툴바를 붙이시게 되면, 특별하게 툴바에 theme을 적용하지 않는 한은 AppTheme이 적용되겠죠. 그리고 AppTheme을 오버라이드 하는 Overlay가 있다면 이게 먼저 적용될 거구요. 님이 말한대로 님이 정의한 Overlay가 적용된 후 나머지 부분에 AppTheme이 적용된 거라고 할 수 있을 것 같네요.
감사합니다. theme파일이 뭔지 몰랐는데 이전의 style을 말씀하시는거같네요.
제가 예전에내비게이션  드로어 액티비티를 만들었을때는 theme이 style에 정의 됐었는데 내비게이션 드로어 액티비티를 새로만들어보니 이것저것 바뀌었네요..
theme이 theme.xml에 따로 정의가 되네요.
 각설하고 질문 몇가지만 다시드리겠습니다.

현재 본문 코드에서 보시다시피 Appbarlayout과 Toolbar가 설정되어있습니다.
theme도 설정되어있구요. 말씀대로 새로운 툴바를 붙이게 되는거겠죠.
그리고 theme을 적용 했으니 AppTheme이 적용되지않을거라고 생각합니다.

그런데 이후에 AppTheme을 오버라이드 하는 Overlay가 있다면 먼저 적용되고 AppTheme이 적용된거라고 할수 있을거같다고 하셨는데 뭔지 잘모르겠습니다.

AppTheme을 오버라이드 했다는게 본문에 style.xml 의 코드를 보면
AppTheme.AppBarOverlay와 AppTheme.PopupOverlay가 있습니다. 이걸 AppTheme을 오버라이드 해서 정의 하는 Overlay가 되는건가요?

이건 제가 직접정의한게 아니라 내비게이션 드로어 액티비티를 만들면서 자동으로 생성된 theme이더라구요.이게 본문에서 보시다시피 정의된 앱바와 툴바에 적용되어있있습니다..

AppbarOverlay와 PopupOverlay가 Apptheme을 오버라이드해서 만든 스타일이 맞다면 이 theme이 적용되고 Apptheme도 적용되는 형태가 되는건가요?
그러니까 Apptheme이 NoAcionBar임에도 아이콘이 변경되는 코드가 적용됐던게 Apptheme이 어디 직접적으로 적용돼서 보였던게 아니라 오버라이드 돼면서 거기에 같이 적용됐다는건가요? 간접적으로

그래서 AppTheme.AppBarOverlay과 AppTheme.PopupOverlay가 적용된후에
부모?인 Apptheme도 적용되는데.. Apptheme은 NoActionBar이고 style에는
아이콘을 바꾸는 style이 있으니 이게 나머지로 적용되어 보이는 형태인가요?

그리고 그렇다면 매니페스트에 application에 theme에 적용된 Apptheme은
아이콘이 보이는 유무와는 크게 상관이 없는거겠네요?
왜냐하면 AppbarLayout과 Toolbar에 theme으로AppTheme.AppBarOverlay과 AppTheme.PopupOverlay이 적용되었는데 이건 Apptheme을 오버라이드한것이고 Apptheme도 적용된다고 하셨으니 Apptheme에는 아이콘을 변경하는 코드까지 있기때문이라고 생각하는데

제가 이해한게 잘맞는지 모르겠습니다.. 질문이 길어졌습니다 죄송합니다 감사합니다
...