차근차근/Android
actionbar 란
[안드로이드]액션바에 대하여..
안드로이드 3.0, 허니컴(Honeycomb)에서는 태블릿 단말에 최적화된 컴포넌트들이 많이 추가되었는데, 프래그먼트(Fragment)와 함께 허니컴에서 추가된 대표적인 UI 컴포넌트 중 하나가 바로 액션바(Action bar)입니다.
기존 안드로이드 APP의 TitleBar가 단순한 제목의 표시나 간단한 정보만을 표시했다면 액션바는 아래와 같은 다양한 기능을 제공하며 4.0부터는 메뉴버튼까지 대체합니다.
액션바의 주요기능
1) 타이틀바의 기능인 제목 표시 및 간단한 정보 표현
2) 사용자의 현재 위치 식별
3) 각종메뉴-탐색메뉴,액션항목을 통한 단축메뉴-제공
4) Navigation 지원
액션바의 주요목적
1) APP의 이름,정보 와 사용자 위치 식별하기 위한 전용공간 제공
2) 다른 APP사의 일관된 네비게이션과 뷰의 세분화 제공
3) 검색,생성 공유와 같은 주요 액션에 대한 용이한 젭근 및 예측 가능 접근
액션바의 주요UI
1. 앱 아이콘
: 애플리케이션 아이콘은 애플리케이션에 아이덴티티를 부여합니다. 원할 경우 다른 로고나 브랜드로 교체할 수도 있습니다. 중요: 만약 애플리케이션이 현재 최상위 화면을 표시하고 있지 않다면, 사용자가 상위 계층으로 이동할 수 있도록 애플리케이션 왼쪽에 상위 기호(Up caret)를 표시해야 합니다.
2. view control
3. Action button
: 액션 섹션에서 애플리케이션의 중요한 액션들을 표시합니다. 액션 바에 들어갈 공간이 없는 액션들은 자동으로 액션 오버플로우 속으로 이동합니다.
4. Action overflow
: 덜 자주 사용하는 액션은 액션 오버플로우에 배치합니다.
액션바의 사용시 주의사항
ActionBar, 액션바를 사용하기 위해서는 targetSdkVersion에 11 이상을 지정하셔야 합니다.
1 | < uses-sdk android:targetSdkVersion = "11" /> |
minSdkVersion은 하위 버전에 대한 호환을 고려하지 않을경우, 11이상으로 해두시면 됩니다.
이렇게 targetSdkVersion을 API 11이상으로 설정하시면, 자동적으로 액션바가 사용이 됩니다.
Split action bar
안드로이드 4.0부터 split action bar라고 불리는 추가적인 모드를 사용할 수 있다. 분할 액션바를 사용하면 화면 하단에 별도의 bar가 보이며, 좁은 화면에서 액티비티가 실행되더라도 모든 액션 항목을 보여준다. 액션바를분할하여 액션 항목을 분리하는 것은 상단에 내비게이션과 타이틀 요소를 남겨둔 채로 좁은 화면에서 합리적인 공간을 사용하여 모든 액션 항목을 표시한다. 그리고 다양한 기기의 화면 크기와 화면 회전에 고려한 APP을 만들 때 중요한 UI입니다.
분할 액션바를 활성화하려면 uiOptions="splitActionBarWhenNarrow"를 매니페스트 파일의 <activity> 혹은 <application> 엘리먼트에 추가하면 됩니다.
1. 메인 액션바
2. 상단바
3. 하단바
사용자가 빠르게 애플리케이션에서 제공하는 뷰 간을 전환할 수 있도록, 상단 바에 탭이나 스피너를 배치하고 액션과 액션 오버 플로우를 표시하려면 하단 바를 배치하는 방법이 유용한 UI가 될 수 있습니다.
액션바(Action bar) 따라잡기 - 액션바가 뭔가요?
http://androidhuman.tistory.com/472
안드로이드 3.0, 허니컴(Honeycomb)에서는 태블릿 단말에 최적화된 컴포넌트들이 많이 추가되었는데요, 프래그먼트(Fragment)와 함께 허니컴에서 추가된 대표적인 UI 컴포넌트 중 하나가 바로 액션바(Action bar)입니다.
액션바는 기존 안드로이드 애플리케이션의 타이틀바(Title bar)를 대체하는 컴포넌트로, 기존 타이틀바가 단순히 제목만을 표시하거나 간단한 정보만을 표시할 수 있던 것에 반해 액션바는 제목 표시 뿐만 아니라 메뉴 제공, 액션 아이템(Action item)을 통한 단축 메뉴 제공, 탭 지원 등 다양한 기능을 포함하고 있습니다. 다음은 전형적인 액션바의 모습을 보여줍니다.
액션바(Action bar)의 모습
액션바를 표시하려면?
안드로이드 3.0 이하 버전으로 작성된 애플리케이션 (매니페스트에 Min SDK Version / Target SDK Version이 11 이하인 경우)을 안드로이드 3.0이 탑재된 단말기에서 실행하면 액션바 대신 기존의 타이틀바가 그대로 표시됩니다. 때문에, 기존 플랫폼 버전을 지원함과 동시에 액션바도 표시되도록 하려면 매니페스트의 Target SDK Version을 11 이상으로 수정해야 합니다.
기존 버전과 3.0버전 이상을 동시에 지원하기 위한 매니페스트 설정
액션바와 메뉴(OptionsMenu), 그리고 액션 아이템(Action item)
액션바와 메뉴는 뗼레야 뗄 수 없는 관계입니다. 안드로이드 3.0 이상이 탑재된 단말기를 처음 접하게 되면 메뉴키가 없어 당황하는 분들이 꽤 있습니다. 물론 기존 플랫폼 버전을 타깃으로 작성된 애플리케이션을 실행했을 때는 메뉴를 호출할 수 있도록 하단에 메뉴키가 생기지만, 안드로이드 3.0을 타깃으로 작성된 애플리케이션에서는 메뉴키를 찾을 수 없을 것입니다.
기존 버전을 타깃으로 작성된 애플리케이션을 안드로이드 3.0 이상에서 실행했을 때 메뉴 표시모습
그렇다면, 메뉴는 과연 어디에 표시되는 것일까요? 답은 의외로 가까운 곳에 있습니다. 바로 액션바입니다. 액션바는 여러 역할을 하지만, 가장 주된 역할은 메뉴를 표시 기능입니다. 기존 버전을 타깃으로 작성된 애플리케이션의 타깃을 안드로이드 3.0 이상으로 변경한 후 다시 실행해보면 다음과 같이 액션바 우측 구석에 메뉴 버튼이 표시되는 것을 확인할 수 있습니다.
안드로이드 3.0부터는 메뉴가 액션바의 오버플로우 메뉴(눌렀을 때 리스트로 나타나는 메뉴)에 표시되며, 메뉴 항목 중 빈번한 사용이 예상되는 항목은 액션바에 바로 항목이 노출되도록 할 수 있습니다. 이렇게 오버플로우 메뉴가 아닌 액션바에 바로 노출되는 항목을 액션 아이템(Action item)이라 합니다.
일반 메뉴 항목을 액션 아이템으로 표시되도록 하는 방법은 크게 두 가지입니다. 하나는 메뉴 XML을 사용하는 방법, 다른 하나는 코드로 구현하는 방법입니다. 두 가지 방법 모두 동일한 결과를 내는 데는 문제가 없지만, 코드를 통해 구현하는 경우 SDK 버전에 맞추어 별도로 코드를 작성해야 하므로 XML을 통해 설정하는 방법을 권장합니다.
XML에서 메뉴 항목이 액션 아이템으로 표시되도록 설정하려면 다음과 같이 android:showAsAction 속성을 지정하면 됩니다. 다음 예제는 메뉴 항목에 대해 공간이 있을 경우 메뉴 항목의 텍스트를 동시에 표시하도록 구현하고 있습니다.
1 2 3 4 5 6 7 | <? xml version = "1.0" encoding = "utf-8" ?> < item android:id = "@+id/menu_add" android:icon = "@drawable/ic_menu_save" android:title = "@string/menu_save" android:showAsAction = "ifRoom|withText" /> </ menu > |
android:showAsAction 속성으로 지정할 수 있는 항목은 다음과 같습니다.
- ifRoom : 액션 아이템을 표시할 수 있는 공간이 있다면 액션 아이템을 표시합니다.
- never : 항상 액션 아이템으로 표시하지 않습니다. (기본값)
- withText : 메뉴 항목의 아이콘과 메뉴 항목의 텍스트를 함께 액션 아이템으로 표시합니다.
- always : 항상 액션 아이템으로 표시합니다.
메뉴 항목이나 액션 항목을 선택했을 때 수행할 작업 구현은 기존과 동일하게 onOptionsItemSelected() 메서드에서 처리합니다. 안드로이드 3.0부터는 액션바 좌측에 애플리케이션 아이콘이 기본적으로 표시되는데, 이 아이콘을 눌렀을 때 처리할 동작 또한 동일한 메서드에서 처리할 수 있습니다. 애플리케이션 아이콘의 id는 android.R.id.home으로, onOptionsItemSelected()에서 이 id를 사용하여 적절한 작업을 수행하도록 구현할 수 있습니다.
액션바 감 잡아보기
지금까지 액션바에 대해 간단히 알아보았으니 예제를 통해 확실히 사용법을 알아보도록 하겠습니다.
액티비티
- Main (Main.java)
메뉴 리소스
- menu.xml
API Level
- Android 3.0 (API Level 11)
프로젝트를 생성한 후, 다음과 같이 리소스 추가 마법사를 사용하여 메뉴 리소스를 추가합니다.
메뉴 리소스를 추가합니다.
다음, 메뉴 항목을 추가합니다. 예제에서는 총 3개의 메뉴 항목을 추가합니다. 다음과 같이 메뉴 리소스를 작성합니다.
[menu.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <? xml version = "1.0" encoding = "utf-8" ?> < item android:showAsAction = "ifRoom|withText" android:id = "@+id/item1" android:icon = "@android:drawable/ic_menu_add" android:title = "Add" /> < item android:id = "@+id/item2" android:showAsAction = "always" android:title = "Action item with icon" android:icon = "@android:drawable/ic_menu_search" /> < item android:title = "Normal item" android:id = "@+id/item3" /> </ menu > |
각 메뉴 항목을 보면 각각 다른 속성을 적용한 것을 알 수 있습니다. 첫 번째 항목과 두 번째 항목은 모두 액션 아이템으로 표시하도록 설정하였지만, 첫 번째 항목은 액션바에 빈 공간이 있을 때만 표시하며 아이콘과 텍스트 모두 표시되도록 설정하였습니다. 두 번째 항목은 항상 액션 아이템으로 표시되도록 하였으며, 세 번째 항목은 일반적인 메뉴 항목으로써 오버플로우 메뉴에 표시되도록 설정하였습니다.
다음, 메뉴 항목을 선택했을 때 실행할 동작을 구현해 보도록 하겠습니다. 우선 onCreateOptionsMenu()에서 메뉴 리소스 파일을 불러 메뉴에 적용한 후, onOptionsItemSelected() 메서드에서 각 메뉴 항목을 선택했을 때 수행할 동작을 구현합니다.
[Main.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true ; } @Override public boolean onOptionsItemSelected(MenuItem item) { String text = null ; switch (item.getItemId()){ case android.R.id.home: text = "Application icon" ; break ; case R.id.item1: text = "Action item, with text, displayed if room exists" ; break ; case R.id.item2: text = "Action item, icon only, always displayed" ; break ; case R.id.item3: text = "Normal menu item" ; break ; default : return false ; } Toast.makeText( this , text, Toast.LENGTH_SHORT).show(); return true ; } |
각 항목을 선택할 때마다 해당 항목의 속성을 토스트로 표시하도록 구현했습니다. 앞에서 알아본 것과 같이 액션바에 표시되는 애플리케이션 아이콘(android.R.id.home)을 선택한 것 또한 감지하여 토스트로 표시하도록 구현했습니다.
예제를 실행하면 다음과 같이 액션바가 표시되는것을 확인할 수 있습니다. 메뉴 리소스에서 설정한 것과 같이 첫번째와 두번째 항목이 액션 아이템으로 표시되고, 나머지 한 항목은 오버플로우 메뉴에 표시됩니다.
액션바가 표시되는 모습
각 항목을 선택하면 앞에서 구현한 것과 같이 각 항목에 해당하는 토스트가 표시됩니다. 애플리케이션 아이콘을 눌렀을 때 토스트가 표시되는 것 또한 확인할 수 있습니다.
애플리케이션 아이콘을 선택했을 때의 모습
애플리케이션 흐름을 알려주는 액션바의 요소들
애플리케이션을 사용하다 보면 화면이 전환되어 홈 화면보다 하위 단계의 화면에 오게 되는 경우가 많은데, 간혹 내가 보고 있는 화면이 홈 화면인지, 하위 단계의 화면인지 혼동되는 경우가 있습니다.
액션바는 위와 같은 사용자들의 혼동을 방지하기 위해, 하위 단계 화면일 경우 이를 사용자가 인지할 수 있도록 액션바 좌측 아이콘에 '업 네비게이션(Up navigation)'이라 하는 작은 삼각형을 표시하도록 제공하고 있습니다. 다음 화면은 일반적인 상태와 업 네비게이션으로 표시될 때의 액션바 아이콘을 보여줍니다.
일반 상태일 때와 업 네비게이션 상태의 액션바 아이콘
액션바 아이콘을 업 네비게이션 형태로 표시하려면 setDisplayHomeAsUpEnabled() 메서드를 사용합니다. 액션바의 인스턴스는 액티비티의 getActionBar() 메서드로 얻을 수 있습니다.
API
public abstract void setDisplayHomeAsUpEnabled (boolean showHomeAsUp)
액션바 아이콘을 업 네비게이션 형태로 표시합니다.
이 뿐만 아니라, 액션바에 탭을 추가하여 여러 화면을 더 깔끔하게 구성하는 것도 가능합니다. 다음은 액션바에 탭이 추가된 모습을 보여줍니다.
액션바에서 탭을 표시하는 모습
액션바에 탭을 추가하려면 액션바의 네비게이션 모드를 탭 모드로 설정한 후, 탭을 추가하면 됩니다.
API
public abstract void setNavigationMode(int mode)
액션바의 네비게이션 모드를 설정합니다.
액션바의 네비게이션 모드는 총 세가지로, 기본 모드인 ActionBar.NAVIGATION_MODE_STANDARD, 탭을 표시하는 모드인 ActionBar.NAVIGATION_MODE_TABS, 리스트를 표시하는 모드인 ActionBar.NAVIGATION_MODE_LIST가 있습니다.
API
public abstract void addTab(ActionBar.Tab)
액션바에 탭을 추가합니다.
Tab 인스턴스는 ActionBar.newTab() 메서드를 통해 얻을 수 있으며, 탭을 추가한 후에는 필히 ActionBar.Tab.setTabListener() 메서드를 사용하여 각 탭이 선택되었을 때 수행할 동작을 처리할 TabListener를 등록해야 합니다.
액션바 모습 변경하기
액션바는 기본적으로 애플리케이션 아이콘과 제목이 표시됩니다. 하지만 원한다면 이를 표시되지 않도록 할 수도 있습니다. 또한, 애플리케이션 아이콘 대신 액션바에 최적화된 그림인 '로고'를 표시하도록 하는 것도 가능합니다.
로고는 매니페스트에서 지정할 수 있으며, 로고를 지정하면 애플리케이션 아이콘 대신 로고가 기본적으로 액션바에 표시됩니다. 로고를 표시하거나 표시하지 않도록 하려면 ActionBar.setDisplayUseLogoEnabled() 메서드를 사용합니다.
API
public abstract void setDisplayUseLogoEnabled(boolean enabled)
액션바의 로고 표시유무를 설정합니다.
로고와 마찬가지로 액션바에 표시되는 제목도 ActionBar.setDisplayShowTItleEnabled() 메서드를 사용하여 쉽게 표시 여부를 설정할 수 있습니다.
API
public abstract void setDisplayShowTitleEnabled(boolean enabled)
액션바에 표시되는 제목의 표시유무를 설정합니다.
액션 바 스타일링 하기
Styling the Action Bar
액션바는 유저가 기능을 실행하거나 앱을 돌아다니는 데 익숙한 UI 를 제공한다. 하지만 액션바가 다른 앱들하고 완전히 똑같이 생겨야 하는 것은 아니다. 액션바를 커스터마이즈 하고 싶다면, styles and theme 리소스들을 이용하면 된다.
안드로이드는 "dark" 와 "light" 액션 바 스타일을 가지고 있는 activity theme 들을 제공한다. 이 theme 들을 커스터마이즈 하여 action bar 의 모양을 변경할 수도 있다.
Note: Support Library 를 사용하고 있다면, API level 11 이상에서 제공되는 Theme.Holo 패밀리 대신에Theme.AppCompat 을 사용하여야 한다. Theme.AppCompat 을 사용한다면, 스타일 속성을 두번씩 선언해야 한다: android: 형태로 한번, Support Library 의 appcompat.R.attr 형태로 (이 속성의 context 는 사실 _여러분의 앱_ 이다) 한번 선언한다. 아래 예제들에서 더 자세한 내용을 확인할 수 있다.
Use an Android Theme
안드로이드는 액션 바의 색깔을 결정하는 두개의 기본 activity theme 을 제공한다:
- Theme.Holo 은 "dark" theme 을 제공한다.
- Theme.Holo.Light 은 "light" theme 을 제공한다.
이 theme 들을 전체 앱에 적용하거나, 개별 액티버티에 적용할 수 있다. manifest 파일에 있는, [<application>] 나 개별 <activity> 에 android:theme
속성을 주면 된다.
예를들면:
<application android:theme="@android:style/Theme.Holo.Light" ... />
Theme.Holo.Light.DarkActionBar 을 이용하여, 액티버티들은 light color scheme 을 사용하고, 액션 바만 dark scheme 을 사용하게 할 수도 있다.
Support Library 를 사용할 때에는 Theme.AppCompat theme 을 이용한다:
- Theme.AppCompat 은 "dark" theme 이다.
- Theme.AppCompat.Light 은 "light" theme 이다.
- Theme.AppCompat.Light.DarkActionBar 을 이용하면 action bar 만 dark theme 을 사용하게 할 수 있다.
액션 바와 구별되는 action bar icon 을 사용하라. Action Bar Icon Pack 이 Holo light 을 이용할 때 사용할 icon 과 Holo dark 액션 바를 이용할 때 사용할 icon 을 모두 제공한다.
Customize the Background
액션바의 백그라운드 색을 변경하려면 actionBarStyle 속성을 덮어쓰는 (override) 커스텀 theme 을 만든다. 이 속성은 style 을 가리키게 되고, 이 스타일의 background 속성을 액션바에서 사용할 drawable 리소스로 변경하면 된다.
앱이 navigation tabs 을 이용하거나 split action bar 을 이용한다면, backgroundStacked 이나 backgroundSplit속성을 이용하여 백그라운드를 변경할 수도 있다.
Caution: 여러분의 커스텀 theme 이 상속받을 부모 theme 을 잘 설정하는 것이 중요하다. 부모가 제공하는 style 이 없으면, 직접 스타일을 정의해야 할 것이다.
For Android 3.0 and higher only
Android 3.0 이상을 지원하려면, action bar 의 백그라운드를 다음처럼 지정할 수 있다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.Holo.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
</style>
<!-- ActionBar styles -->
<style name="MyActionBar"
parent="@style/Widget.Holo.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/actionbar_background</item>
</style>
</resources>
그리고 위의 theme 을 전체 app 이나 개별 액티버티에 적용한다:
<application android:theme="@style/CustomActionBarTheme" ... />
For Android 2.1 and higher
Support Library 를 사용할 때는, 다음과 같이 theme 을 정의 한다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<!-- Support library compatibility -->
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
<!-- ActionBar styles -->
<style name="MyActionBar"
parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="android:background">@drawable/actionbar_background</item>
<!-- Support library compatibility -->
<item name="background">@drawable/actionbar_background</item>
</style>
</resources>
그리고 정의한 theme 을 앱 전체나 개별 액티버티에 적용한다:
<application android:theme="@style/CustomActionBarTheme" ... />
Customize the Text Color
액션 바의 텍스트 칼러를 변경하려면, 변경하려는 각각의 텍스트 요소의 속성을 변경하여야 한다:
Action bar title: textColor 값을 설정하는 커스텀 스타일을 만들고, 커스텀 actionBarStyle 의 titleTextStyle 속성값으로 커스텀 스타일을 설정한다.
Note: titleTextStyle 에 사용할 커스텀 스타일은 TextAppearance.Holo.Widget.ActionBar.Title 을 부모로 설정해야 한다.
Action bar tabs: 액티버티 theme 의 actionBarTabTextStyle 을 변경한다.
- Action buttons: 액티버티 theme 의 actionMenuTextColor 을 변경한다.
For Android 3.0 and higher only
Android 3.0 이상을 지원할 때에는 스타일 XML 파일은 다음처럼 생겼다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.Holo">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
<item name="android:actionMenuTextColor">@color/actionbar_text</item>
</style>
<!-- ActionBar styles -->
<style name="MyActionBar"
parent="@style/Widget.Holo.ActionBar">
<item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
</style>
<!-- ActionBar title text -->
<style name="MyActionBarTitleText"
parent="@style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">@color/actionbar_text</item>
</style>
<!-- ActionBar tabs text styles -->
<style name="MyActionBarTabText"
parent="@style/Widget.Holo.ActionBar.TabText">
<item name="android:textColor">@color/actionbar_text</item>
</style>
</resources>
For Android 2.1 and higher
Support Library 를 사용할 때에는, 스타일 XML 파일은 다음처럼 생겼을 것이다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
<item name="android:actionMenuTextColor">@color/actionbar_text</item>
<!-- Support library compatibility -->
<item name="actionBarStyle">@style/MyActionBar</item>
<item name="actionBarTabTextStyle">@style/MyActionBarTabText</item>
<item name="actionMenuTextColor">@color/actionbar_text</item>
</style>
<!-- ActionBar styles -->
<style name="MyActionBar"
parent="@style/Widget.AppCompat.ActionBar">
<item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
<!-- Support library compatibility -->
<item name="titleTextStyle">@style/MyActionBarTitleText</item>
</style>
<!-- ActionBar title text -->
<style name="MyActionBarTitleText"
parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/actionbar_text</item>
<!-- The textColor property is backward compatible with the Support Library -->
</style>
<!-- ActionBar tabs text -->
<style name="MyActionBarTabText"
parent="@style/Widget.AppCompat.ActionBar.TabText">
<item name="android:textColor">@color/actionbar_text</item>
<!-- The textColor property is backward compatible with the Support Library -->
</style>
</resources>
Customize the Tab Indicator
navigation tabs 가 사용하는 indicator 를 변경하려면, actionBarTabStyle 을 재정의한 activity theme 을 만들어야 한다. 이 속성은 다른 style 리소스를 가리키게 되며, 이 스타일 리소스의 background 속성을 state-list drawable 을 사용하도록 설정한다.
Note: state-list drawable 은 현재 선택된 탭과 나머지 탭들의 상태 (state) 을 다른 백그라운드를 사용하여 표현한다. 여러개의 버튼 상태를 표현할 수 있는 drawable 리소스를 만드는 방법은 State List 문서를 참조하기 바란다.
예를 들면, 다음 state-list drawable 은, 액션 바 탭의 여러 상태마다 다른 background 이미지를 사용하도록 정의한다.
res/drawable/actionbar_tab_indicator.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- STATES WHEN BUTTON IS NOT PRESSED -->
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false"
android:state_pressed="false"
android:drawable="@drawable/tab_unselected" />
<item android:state_focused="false" android:state_selected="true"
android:state_pressed="false"
android:drawable="@drawable/tab_selected" />
<!-- Focused states (such as when focused with a d-pad or mouse hover) -->
<item android:state_focused="true" android:state_selected="false"
android:state_pressed="false"
android:drawable="@drawable/tab_unselected_focused" />
<item android:state_focused="true" android:state_selected="true"
android:state_pressed="false"
android:drawable="@drawable/tab_selected_focused" />
<!-- STATES WHEN BUTTON IS PRESSED -->
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false"
android:state_pressed="true"
android:drawable="@drawable/tab_unselected_pressed" />
<item android:state_focused="false" android:state_selected="true"
android:state_pressed="true"
android:drawable="@drawable/tab_selected_pressed" />
<!-- Focused states (such as when focused with a d-pad or mouse hover) -->
<item android:state_focused="true" android:state_selected="false"
android:state_pressed="true"
android:drawable="@drawable/tab_unselected_pressed" />
<item android:state_focused="true" android:state_selected="true"
android:state_pressed="true"
android:drawable="@drawable/tab_selected_pressed" />
</selector>
For Android 3.0 and higher only
Android 3.0 이상을 사용할 때에는, 스타일 XML 이 다음처럼 생겼을 것이다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.Holo">
<item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
</style>
<!-- ActionBar tabs styles -->
<style name="MyActionBarTabs"
parent="@style/Widget.Holo.ActionBar.TabView">
<!-- tab indicator -->
<item name="android:background">@drawable/actionbar_tab_indicator</item>
</style>
</resources>
For Android 2.1 and higher
Support Library 를 사용할 때에는, 스타일 XML 파일이 다음처럼 생겼을 것이다:
res/values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
parent="@style/Theme.AppCompat">
<item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
<!-- Support library compatibility -->
<item name="actionBarTabStyle">@style/MyActionBarTabs</item>
</style>
<!-- ActionBar tabs styles -->
<style name="MyActionBarTabs"
parent="@style/Widget.AppCompat.ActionBar.TabView">
<!-- tab indicator -->
<item name="android:background">@drawable/actionbar_tab_indicator</item>
<!-- Support library compatibility -->
<item name="background">@drawable/actionbar_tab_indicator</item>
</style>
</resources>
More resources
- Action Bar 가이드에 더 많은 스타일 속성에 대해 나와 있다.
- Styles and Themes 가이드는 theme 이 어떻게 동작하는지 더 깊게 다룬다.
- 액션바의 스타일을 변경하기 위해 Android Action Bar Style Generator 를 사용하는 것도 좋은 방법이다.
[안드로이드] getActionBar() setDisplayHomeAsUpEnabled
이 네비게이션 기능을 사용하려면 아래 코드를 추가하면 된다.
getActionBar().setDisplayHomeAsUpEnabled(true);
그런데 이건, 보여지게만 추가하는 것이지, 직접 저 버튼을 누른다고 상위 Activity로 이동하지는 않는다.
반드시 아래처럼 동작하는 코드를 추가해주어야 한다.
public boolean onOptionsItemSelected(android.view.MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// NavUtils.navigateUpFromSameTask(this);
finish();
return true;
}
return super.onOptionsItemSelected(item);
};
위에서 // NavUtils.navigateUpFromSameTask(this); 라는 녀석은 좀 무지막지 하다.
이녀석은 현재 Activity stack의 최상위로 한방에 간다.
즉, A > B > C > D 식으로 이동해서 현재가 D Activity 라고 하면, 한방에 A 로 이동한다.
내가 지금 쓰려는건 C 로 차례대로 되돌아가는 것이므로 finish(); 로 처리했다.
참고 : http://blog.naver.com/areema?Redirect=Log&logNo=60176671531
'차근차근 > Android' 카테고리의 다른 글
actionbar , Navigation Drawer, overlay (0) | 2015.02.04 |
---|---|
네비게이션 드로어 Navigation Drawer (0) | 2015.02.04 |
actionbar submenu (0) | 2015.02.03 |
actionbar , 하단tab (0) | 2015.02.03 |
[android] 2.2에서 fragment 사용하기 (0) | 2015.02.03 |
'차근차근/Android'의 다른글
- 현재글actionbar 란