2014년 8월 12일 화요일

[Android/안드로이드] ActionBar 고급정보들.

http://developer.android.com/guide/topics/ui/actionbar.html 


ActionBar는 Android 3.0 ( API Level 11 ) 부터 도입된 녀석.

- ActionBar 의 주된 목적은.
1. Action bar 는 Application 이름, User 위치 표시.
2. 일관된 navigation 이나 view 의 갱신 등에 사용한다.
3. user 가 자주 쓰는 action 을 만들어 제공한다.

ActionBar 는 API Level 11 미만인 녀석과 호환이 안 되기 때문에, 하위호환성을 위해서는 ActionBar 를 Activity 의 Layout 에 정의하는 것이 좋다.

- API Level 11 이상에서는 Theme.Holo 가 default theme 으로 사용되는데, 이 녀석을 사용하는 activity 에서는 actino bar 가 자동으로 추가된다.

- ActionBar 를 사용하기 싫다면 android:theme 에 "@android:style/Theme.Holo.NoActionBar" 를 설정해주면 된다. Runtime 에서 action bar 를 숨기고 싶다면, Activity.getActionBar().hide() 를 해주면 된다. 다시 나오게 하려면 show() 를 부르면 되고, 이때마다 Activity layout 은 arrange 된다.

- ActionBar 의 hide(), show() 마다 Activity 의 layout 이 변경되기 때문에, ActionBar 의 hide(), show() 를 자주 부르는 경우에는 ActionBar 를 Overlay mode 로 유지하는 것이 좋다. Activity 의 android:windowActionBarOverlay 속성을 true 로 설정해주면 된다.

- Activity 의 android:windowActionBar 속성을 false 로 두면, Activity.getActionBar() 가 null 을 return 한다.



Menu Item 에 icon 과 title 둘 다 명시를 했어도, 기본으로는 icon 만 나오게 되어있다. text 도 함께 나오게 하려면 android:showAsAction="widthText" 를 명시해주어야 한다. 하지만 이 text 가 항상 나오는 것은 아니다. 충분한 공간이 있을때만 발생한다.

android:title 은 항상 명시해 주는 것이 좋다. overflow menu 로 들어가게 되면, icon 은 안 나오고 title 만 나온다. 그리고 시력이 안 좋은 사람은 title 보는 것이 훨씬 편하고, 공간 부족으로 icon 만 나오는 경우에 user 가 action item 을 long press 하면 title 이 tool-tip 으로 나온다.

android:showAsAction="always" 로 항상 action bar 에 나오도록 할 수 있지만, 너무 많은 item 을 always 로 만들면 작은 화면에서 layout 문제가 발생할 수 있다. 따라서 권장되지 않는다. ifRoom 이 권장된다.

- Menu 에 들어가는 option 내용은 globally appliable 해야 한다. 한쪽에만 국한되는 내용은, view 로 구성하는 것이 좋다.

- Action Bar 구성은 Frequency, Importance, Typical 을 기준으로 선정한다. 4개 초과의 item 이 action item 으로 보인다면, 다시 한번 고려해보고, priority 가 낮은 녀석을 ifRoom 으로 교체하는 것이 좋다. 

- 다음의 것들은 Action Item 으로 나와서는 안된다. Settings, Help, Feedback 종류. 이것들은 항상 overflow menu 로 두는 것이 좋다.

- 모든 단말이 search h/w button 을 지원하는 것이 아니기 때문에, search 가 중요한 경우에는 첫번째로 나타나는 item 으로 선정하여 지원해주는 것이 좋다.

Android 4.0 ( API Level 14 ) 이상에서는 "split action bar" 라는 기능이 생겼다. Narrow screen 에서 상단 뿐만이 아니라 하단에도 action bar 를 표시하기 위함이다. <activity> 나 <application>에 다음을 명시해주면 된다. uiOptions="splitActionBarWhenNarrow"

setDisplayShowHomeEnabled( false ) & setDisplayShowTitleEnabled( false ) 로 title 부분을 없애주고, narrow screen 일때 actionBar 가 split 되면 상단 actionbar 는 navigation 전용으로 쓸 수 있다.

하위 호환성을 위해서 새롭게 소개된 것들은 가능하면 xml 로 정의하는 것이 좋다. xml attribute 는 이해하지 못하는 내용을 가볍게 무시해주지만, 코드는 그렇지 않기 때문이다. ( 추가작업이 많이 필요하다. )

Actionbar 의 좌측에 application icon 이 나오는데, 이 녀석을 action item 으로 사용할 수 있다. 이 녀석은 application 의 "home" activity 로 이동하거나, activity stack 의 "up" 기능을 수행할 수 있다. application icon 을 터치하면 onOptionsItemSelected() 에 android.R.id.home ID 로 event 가 들어온다. 만약 "home" activity 로 가는 용도로 사용한다면 FLAG_ACTIVITY_CLEAR_TOP 을 넣어주는 것이 좋다.

Android 4.0 ( API Level 14 ) 부터는 application icon 이 기본으로 action item 으로 작동하지 않는다. 기본으로 작동하게 하려면 setHomeButtonEnabled( true ) 를 호출해주어 한다.

- "Back" 과 "Up" 은 다르다. 다른 App 에서 현재 App으로 왔을 때 Back 은 호출한 Activity 로 이동하지만, Up은 현재 App 은 Hierarchy 상 윗단으로 이동하게 된다.

 
Application icon 을 "up" 으로 동작시키기 위해서는 setDisplayHomeAsUpEnabled( true ) 를 설정해주어야 한다. up 으로 동작시킬때는 FLAG_ACTIVITY_CLEAR_TOP 을 명시해 주는 것이 좋다.

- 해당 activity 가 "up"을 제공하며, 여러 경로로 접근 가능하다면, 가장 최근에 접속한 path 로 up 되도록 해야 한다.



Action View 는 action bar 에 들어가는 widget이다. 이 widget도 menu item 으로 정의되는데, android:actionLayout 이나 android:actionViewClass 를 정의함으로서 가능하다. actionView 를 사용할때는 android:showAsAction 속성을 collapseActionView 를 넣어줄 수 있다. 이것은 widget 을 button 으로 축소하는 역할을 해준다.  user 가 이 버튼을 눌렀을 때 actino view 가 expand 되면서 성립된다.

- actionView 도 collapse 된 상태에서는 overflow menu 안에 들어갈 수도 있다.

- collapse 된 actionView를 click 하면 자동으로 expand 되지만, onOptionsItemSelected 에 무조건 callback 이 온다. 여기서 만약 return true 를 해버리면, expand 하는 것도 막을 수 있다.

- actionView 가 expand 된 상태에서 user 가 "up" icon 을 누르거나 Back button 을 누르 면 다시 collapse 된다.

expandActionView(), collapseActionView() 를 통해서 expand 와 collapse 를 control 할 수도 있다.

- expand 와 collapse 여부는 OnActionExpandListener 를 MenuItem.setOnActionExpandListener() 로 등록함으로서 받을 수 있다. OnActionExpandListener 는 onMenuItemActionCollapse( MenuItem ) 과 onMenuItemActionExpand( MenuItem ) 을 가지고 있다.

ActionProvider 는 submenu 도 가질 수 있으며, 일반 action item 처럼 control 이 되는데, 이 control 이 위임되는 형식이다. action bar에서의 overflow 메뉴 안에서의 모양과 행동에 대해 control 을 한다.

- actionProvider 정의는 android:actionProviderClass 속성을 정의해줌으로 가능하다. 

- actionProvider 에 대한 event 발생시, 해당 actionProvider 가 모든 처리를 하지만, onOptionsItemSelected() 를 통해서 override 도 가능하다. event 발생시 actionProvider 의 onPerformDefaultAction() callback 이 불린다. 만약 actionProvider 가 subMenu 를 제공한다면 onOptionsItemSelected() callback 이 불린다. 

ShareActionProvider 는 share를 위한 유용한 utility class 이다. 이 녀석은 Share 의 frequency 도 관리해준다. 이 녀석한테 해줘야 할것은 setShareIntent( Intent ) 뿐이다.
 
Actionbar 의 item 들을 관리하는데 ActionProvider 를 상속한 녀석을 link 시켜주는것이 reusability 측면에서 좋다. ActionProvider 의 onCreateActionView() 함수를 구현해주어 view 를 initialize 해주어야 한다. 그리고 item 이 선택되었을 때의 callback 은 onPerformDefaultAction() 이다.

- ActionProvider 가 subMenu 를 지원할 예정이라면 onPrepareSubMenu() 를 구현해주어야 하고, 이 때 event callback 은 onOptionsItemSelected() 로 들어온다. ( onPerformDefaultAction() 은 들어오지 않는다. )

- ActionBar 에는 Navigation Tab 도 넣을 수 있다. 이 Navigation Tab 은 screen 이 좁을 경우에 stack 을 이루어 보여진다. Tab 은 TabListener 를 통해 event 를 받을 수 있다. 탭의 추가는 addTab( ActionBar.Tab ) 을 통해서 한다. ActionBar 에서 Tab 을 보이게 하기 위해서는 setNavigationMode( NAVIGATION_MODE_TABS ) 를 호출해주어야 한다. Title 부분을 감추고 Tab 만 보이게 하려면, setDisplayShowTitleEnabled( false ) 를 call 해주면 된다.

TabListener 에 parameter 로 들어오는 FragmentTransaction 은 systsem 이 자동으로 commit 을 불러주기 때문에 불러주면 안된다. 그리고 이 FragmentTransaction 은 BackStack 에 저장할 수 없다.

- getSelectedNavigationIndex() 를 통해, state 를 저장할 때 현재 선택된 navigation tab index 를 얻어올 수 있다. 

- 가끔가다 design 적 문제로 ( 화면이 너무 좁다던지.. ) action tab 이 drop-down list 로 나오는 경우도 있다.

- Drop-down Navigation 을 직접 구현할수도 있는데, 이는 SpinnerAdapter 를 사용하여 만들고, setListNavigationCallbacks( SpinnerAdpater, NavigationCallback ) 을 통해 listener 를 등록한다.

- android:windowActionBarOverlay 는 actionBar 가 activity 위에 overlay 로 존재할지, 아니면 같은 depth level 에서 존재할지를 결정하는 속성값. default 는 false. overlay 일때, actionBar 는 semi-transparent 하기 때문에 activity가 배경으로 보인다. ( 이 반투명도 theme 변경으로 불투명으로도 만들 수 있다. ) overlay 모드를 사용할 경우는 android:layout_marginTop="?android:attr/actionBarSize" 를 이용하여 마진을 주는 것도 좋은 방법이다.



actionItem 에는 다음과 같은 option 들을 줄 수 있다. 
android:actionButtonStyle
android:actionBarItembackground
android:itemBackground // overflow menu
android:actionBarDivider
android:actionMenuTextColor
android:actionMenuTextAppearance // style
android:actionBarWidgetTheme

Navigation tabs 에는 다음과 같은 option 들을 줄 수 있다.
android:actionBarTabStyle
android:actionBarTabBarStyle
android:actionBarTabTextStyle

- Drop-down list 는 android:actionDropDownStyle 을 option으로 줄 수 있다.

style 을 정의할 때는 parent 를 명시해주는 것이 불필요한 재정의를 막을 수 있어 좋다.

advanced 한 style 을 원한다면, android:actionBarStyle 또는 android:actionBarSplitStyle 을 정의해주면 된다.

댓글 없음:

댓글 쓰기