SECTION 01 _ 액션바 (ActionBar) 405 액션바만들기 참고프로젝트 ActionBarDemoA1 간단히액션바를만들고이액션바가 WVGA(800*480) 과 WXGA(1280*800) 에서어떻게보이는지확인해보도록하겠다. 액션바를만든다는표현을했지만액션바는타이

Similar documents
[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

13ÀåÃß°¡ºÐ

50_1953.pdf

01장

03장

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

( )부록

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

리니어레이아웃 - 2 -

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

어댑터뷰

1부

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

슬라이드 1

Daum 카페

PowerPoint Presentation

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

오버라이딩 (Overriding)

01 [ 일기장 ] 애플리케이션프로젝트작성 - [MyDiary] 앱 Mobile Apps >> [MyDiary] 앱프로젝트구조설계 일기장애플리케이션인 [MyDiary] 앱은메인화면과일기장의내용을작성하는화면으로이루어져있다. 화면이 2개라는것은액티비티가 2개이고액티비티에대

PowerPoint Template

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

TipssoftAppActivity.java // 기본소스파일 main.xml // 배치와구성에관련된리소스파일 string.xml // 프로그램에서사용할문자열에관련된리소스파일 컴파일을하고나면 r.java 라는소스파일이하나추가되는데이파일은리소스파일을소스파일에서이용할수있도

슬라이드 1

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

2_안드로이드UI

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - 04기본위젯(Ver 1.0)

gnu-lee-oop-kor-lec10-1-chap10

PowerPoint 프레젠테이션

View Licenses and Services (customer)

Microsoft PowerPoint App Fundamentals[Part2].pptx

PowerPoint 프레젠테이션

UI VoC Process 안

제11장 프로세스와 쓰레드

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

chap 5: Trees

PowerPoint Presentation

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

Microsoft Word - src.doc

gnu-lee-oop-kor-lec06-3-chap7

제8장 자바 GUI 프로그래밍 II

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

사용설명서를 읽기 전에 안드로이드(Android)용 아이디스 모바일은 네트워크 연결을 통해 안드로이드 플랫폼 기반의 모바일 기기에서 장치 (DVR, NVR, 네트워크 비디오 서버, 네트워크 카메라) 에 접속하여 원격으로 영상을 감시할 수 있는 프로그램입니다. 장치의 사

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint UI-Layout.Menu.pptx

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

사용설명서를 읽기 전에 ios용 아이디스 모바일은 네트워크 연결을 통해 ios 플랫폼 기반의 모바일 기기(iOS 버전 6.0 이상의 ipod Touch, iphone 또는 ipad)에서 장치(DVR, 네트워크 비디오 서버 및 네트워크 카메라)에 접속하여 원격으로 영상을

JUNIT 실습및발표

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

슬라이드 1

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

Microsoft PowerPoint - Java7.pptx

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Design Issues

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint App Fundamentals[Part1].pptx

Android Master Key Vulnerability

Studuino소프트웨어 설치

PowerPoint 프레젠테이션

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

Microsoft PowerPoint - 14주차 강의자료

PowerPoint Presentation

위젯과레이아웃위젯은 View 클래스를상속해화면디스플레이와이벤트처리를할수있도록구현된스크린구성의최소단위를말한다. android.widget 패키지에는여러유형의위젯들이포함되어있다. TextView, ImageView, Button, ImageButton 등은가장간단한위젯들이

Microsoft PowerPoint - 06-Chapter09-Event.ppt

C# Programming Guide - Types

Cluster management software

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint 프레젠테이션

슬라이드 1

Network Programming

PowerPoint Presentation

Endpoint Protector - Active Directory Deployment Guide

쉽게 풀어쓴 C 프로그래밍

12 주차 인텐트

C++ Programming

Visual Basic 반복문

Microsoft PowerPoint - CSharp-10-예외처리

TEST BANK & SOLUTION

PowerPoint Presentation

Transcription:

404 PART 05 _ 안드로이드활용 SECTION 01 액션바 (ActionBar) 액션바 (ActionBar) 는태블릿용버전인안드로이드 3.0( 허니컴, API 레벨 11) 부터등장하여안드로이드 4.0에서는태블릿뿐만아니라폰등의기기에도적용할수있게변경되었다. 액션바라는용어가생소하기는하지만기존타이틀바에다양한기능이추가된것이라고생각하면그리어렵게느껴지지않을것이다. 액션바를통해사용자가현재실행한애플리케이션이무엇인지그리고애플리케이션내에서사용자가보고있는화면이무엇인지를알려줄수있으며, 탐색메뉴를통해사용자가애플리케이션을쉽게탐색할수있게할수있다. 액션바의주요특징 애플리케이션이름, 아이콘그리고애플리케이션내의사용자위치를알려주기위한영역을제공 일관된탐색메뉴제공 검색, 공유등의메뉴영역을제공액션바는다음과같은모양으로구성된다. 그림 5-1 왼쪽에는액티비티의아이콘과제목이표시되며, 오른쪽에는메뉴가표시된다. 메뉴는그림에서보는것처럼아이콘만보이게할수도있고아이콘과제목이함께보이게할수도있다. 또한오른쪽끝에는더보기메뉴아이콘을표시하여추가메뉴는이아이콘을클릭했을때만보이게할수도있다. 액션바에서아이콘이표시되는메뉴들을액션아이템 (Action Item) 이라고한다. 그리고액션바하단에는실제액티비티의메인영역이표시된다.

SECTION 01 _ 액션바 (ActionBar) 405 액션바만들기 참고프로젝트 ActionBarDemoA1 간단히액션바를만들고이액션바가 WVGA(800*480) 과 WXGA(1280*800) 에서어떻게보이는지확인해보도록하겠다. 액션바를만든다는표현을했지만액션바는타이틀바의발전된형태이기때문에별도로만들필요가없다. 어떤추가적인작업을하지않아도타이틀바가보이는것처럼액션바도보이게된다. 그러므로기본프로젝트를한개만들어서실행하면된다. 두개의에뮬레이터를생성해서기본프로젝트를실행한결과는다음과같다. 첫번째그림은 WVGA(800*480) 해상도로우리가일반적으로사용하는폰의해상도에서실행한결과이다. 그리고두번째그림은태블릿해상도인 WXGA(1280*800) 에뮬레이터에서실행한결과다. 그림 5-2 WVGA(800 * 480) 의액션바

406 PART 05 _ 안드로이드활용 그림 5-3 WVGA(1200 * 800) 의액션바 WXGA(1280*800) 해상도의액션바를보면오른쪽이매우허전함을알수있다. 바로이러한이유로인해액션바에서는액션바오른쪽에메뉴를추가할수있게하고있다. 또한액션바중앙에검색뷰와같은별도의뷰를추가할수있게하고있다. 이러한내용에대해서는차츰알아보도록하겠다. 기본프로젝트에서자동으로생성된레이아웃과액티비티코드는다음과같다. main.xml에서 @string/hello가가리키는문자열은 /res/values/strings.xml에작성되어있으며, 이파일도프로젝트생성시기본으로생성되는파일이다. CODE 코드레이아웃 XML - /res/layout/main.xml <?xml version= 1.0 encoding= utf-8?> <LinearLayout xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= fill_parent android:layout_height= fill_parent android:orientation= vertical > <TextView android:layout_width= fill_parent android:layout_height= wrap_content android:text= @string/hello /> </LinearLayout>

SECTION 01 _ 액션바 (ActionBar) 407 기본으로생성된액티비티다. CODE 코드 Main.java package com.androidside.actionbardemoa1; import android.app.activity; import android.os.bundle; public class Main extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); 액션바에메뉴추가하기 참고프로젝트 ActionBarDemoA2 안드로이드 3.0 이전에사용하던타이틀바에서는단지제목문자열만표시할수있었지만 ( 이미지를넣거나레이아웃을바꾸는등의수정이가능하긴했다 ), 3.0 이후부터는타이틀바가액션바로변경되었고, 이액션바에아이콘과제목그리고메뉴를탑재할수있게되었다. 그림 5-4 안드로이드 2.3

408 PART 05 _ 안드로이드활용 안드로이드 3.0 이후액션바는기존타이틀바와는달리매우활용도가높으며, 사용자가애플리케이션을좀더편하고직관적으로사용할수있게도움을준다. 그러므로이섹션에서는액션바에메뉴를추가하고이메뉴를어떻게다룰수있는지살펴볼것이다. 다음은앞으로우리가만들예제프로젝트를 WVGA와 WXGA에적용한결과화면이다. 그림 5-5 WVGA(800 * 480) 의액션바 그림 5-6 WXGA(1280 * 800) 의액션바

SECTION 01 _ 액션바 (ActionBar) 409 두화면의차이점이보이는가? 두화면의차이점을이해하는것은폰과태블릿애플리케이션을한번에개발할수있는안드로이드 4.0을제대로사용하는첫시작이될것이다. WVGA 화면에서는상단메뉴바에모든메뉴를표시할수가없어메뉴버튼을클릭했을때하단에추가메뉴를보여준다. 이방식은안드로이드 3.0 이전의방식이기도하다. 물론안드로이드 3.0 이전버전에는액션바가없었으며, 메뉴는모두하단에표시되었다. 두번째그림은태블릿크기인 WXGA에적용한메뉴를보여준다. WXGA에서는화면이크기때문에오른쪽상단에많은메뉴를보여줄수있으며, 다보여줄수없는추가적인메뉴는더보기 ( ) 메뉴버튼을통해추가적으로볼수있다. 여기서더보기메뉴에보이는메뉴들은개발자가직접정의할수있으며, 이예제에서는 Share 메뉴는더보기메뉴로만보이게설정하고있다. 또한 WXGA 화면에서는 REFRESH 문자열이아이콘과함께보이고있지만 WVGA 화면에서는 REFRESH 문자열이보이지않는다. 이는화면크기로인해안드로이드가자동으로보이지않게하고있기때문이다. 가장먼저이예제에서사용한레이아웃은기본프로젝트생성시자동으로생성된레이아웃이다.// l CODE 레이아웃 XML - /res/layout/main.xml <?xml version= 1.0 encoding= utf-8?> <LinearLayout xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= fill_parent android:layout_height= fill_parent android:orientation= vertical > <TextView android:layout_width= fill_parent android:layout_height= wrap_content android:text= @string/hello /> </LinearLayout> 액션바에설정된메뉴는안드로이드 3.0 이전에작성하던메뉴처럼 /res/menu/ 디렉터리아래에 xml 파일로작성하면된다.

410 PART 05 _ 안드로이드활용 CODE 코드메뉴 XML - /res/menu/main.xml <?xml version= 1.0 encoding= utf-8?> <menu xmlns:android= http://schemas.android.com/apk/res/android > <item android:id= @+id/menu_refresh android:title= @string/menu_refresh android:icon= @drawable/ic_menu_refresh android:orderincategory= 1 android:showasaction= always withtext /> <item android:id= @+id/menu_search android:title= @string/menu_search android:icon= @android:drawable/ic_menu_search android:orderincategory= 0 android:showasaction= always /> <item android:id= @+id/menu_share android:title= @string/menu_share android:icon= @android:drawable/ic_menu_share android:orderincategory= 1 android:showasaction= never /> </menu> menu_search와 menu_share 아이템에서는안드로이드에서기본으로제공하는아이콘 (@android: 로시작 ) 을사용하고있지만, menu_refresh 아이템에서는개발자가직접추가한아이콘을사용하고있다. 이예제를실행하기위해서는 @drawable/ic_menu_refresh가가리키는아이콘을추가해야하며, 필자는 /res/drawable-xhdpi에아이콘을추가했다. 메뉴의첫번째아이템은 Refresh 버튼이며, 두번째는 Search 버튼, 그리고세번째는 Share 버튼이다. 각각의아이템에있는속성중에서관심있게보아야할것은바로 orderincategory와 show- AsAction이다. 먼저 orderincategory 속성은메뉴순서를지정하는것이며, showasaction은해당메뉴를어떻게보여줄지를정하는것이다. 이속성에 always가지정되면액션바에메뉴가표시되며, never는액션바에보여주지않고더보기메뉴로보여지게하는속성이다. 이속성으로인해위두개의액션바화면에서 Share 메뉴가보여지는위치가달랐던것이다. android:showasaction 현재메뉴가액션바의액션아이템으로보여질시점과방식을정의하는속성. 이속성은자바코드에서는 MenuItem 클래스의 setshowasactionflags() 메소드로지정할수있으며, 이메소드의인자로지정할수있는상수값은다음표에정리하였다.

SECTION 01 _ 액션바 (ActionBar) 411 자바코드사용예 ) menuitem.setshowasactionflags(menuitem.show_as_action_if_room) menuitem.setshowasactionflags(menuitem.show_as_action_if_room MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); SUMMARY 액션뷰의액션아이템 showasaction 속성 상수 설명 ifroom 액션아이템을표시할영역이액션바에있을때만표시한다. MenuItem 클래스에정의된상수 MenuItem.SHOW_AS_ACTION_IF_ROOM withtext android:title 로정의된문자열을함께표시한다. MenuItem 클래스에정의된상수 MenuItem.SHOW_AS_ACTION_WITH_TEXT never 액션바에액션아이템을표시하지않는다. 이속성의기본값이다. MenuItem 클래스에정의된상수 MenuItem.SHOW_AS_ACTION_NEVER always 액션바에액션아이템을항상표시한다. 이속성을사용할경우액션아이템이중첩되는문제가발생할수있으므로주의해서사용해야한다. MenuItem 클래스에정의된상수 MenuItem.SHOW_AS_ACTION_ALWAYS collapseactionview 액션아이템과연관된액션뷰 (android:actionviewlayout에선언한 ) 의아이콘만보일수있게한다. 안드로이드 4.0(API 레벨 14) 에서추가됨 MenuItem 클래스에정의된상수 MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW

412 PART 05 _ 안드로이드활용 METHOD SUMMARY android.view.menuitem 클래스의메소드 MenuItem setshowasactionflags(int actionenum) 액션아이템을액션바에어떻게표시할지를지정한다. actionenum에는매개변수 actionenum에나열한상수를지정할수있으며, SHOW_AS_ACTION_ALWAYS, SHOW_AS_ACTION_IF_ROOM, SHOW_AS_ACTION_NEVER는함께지정할수없다. 이 3개의옵션과함께지정할수있는것은 SHOW_AS_ACTION_WITH_TEXT와 SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW이다. 매개변수 actionenum SHOW_AS_ACTION_ALWAYS, SHOW_AS_ACTION_IF_ROOM, SHOW _AS_ACTION_NEVER, SHOW_AS_ACTION_NEVER, SHOW_AS_ACTION_COLL APSE_ACTION_VIEW를지정가능 android:orderincategory 여러액션아이템이나열되는순서를정의하는속성. 메뉴 XML을작성했다면이제메뉴 XML에서 android:title="@string/menu_refresh" 처럼사용한문자열을작성해야한다. 이문자열은 /res/values/strings.xml 파일에작성하면된다. CODE 코드문자열 XML - /res/values/strings.xml <?xml version= 1.0 encoding= utf-8?> <resources> <string name= hello >Hello World, Main!</string> <string name= app_name >ActionBarDemoA2</string> <string name= menu_refresh >Refresh</string> <string name= menu_search >Search</string> <string name= menu_share >Share</string> </resources> 이제액티비티코드를살펴보도록하자.

SECTION 01 _ 액션바 (ActionBar) 413 CODE Main.java package com.androidside.actionbardemoa2; import android.app.activity; import android.os.bundle; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.widget.toast; public class Main extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); getactionbar().sethomebuttonenabled(true); @Override public boolean oncreateoptionsmenu(menu menu) { MenuInflater menuinflater = getmenuinflater(); menuinflater.inflate(r.menu.main, menu); return super.oncreateoptionsmenu(menu); @Override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case android.r.id.home: Toast.makeText(this, Home, Toast.LENGTH_SHORT).show(); break; case R.id.menu_refresh: Toast.makeText(this, Refresh, Toast.LENGTH_SHORT).show(); break; case R.id.menu_search: Toast.makeText(this, Search, Toast.LENGTH_SHORT).show(); break;

414 PART 05 _ 안드로이드활용 case R.id.menu_share: Toast.makeText(this, Share, Toast.LENGTH_SHORT).show(); break; return super.onoptionsitemselected(item); 코드가다소길기는하지만특별히새로운코드는보이지않는다. 액션바에적용되는메뉴가기존 에사용하던옵션메뉴이기때문이다. 그러므로옵션메뉴를사용하는것처럼코드를작성하면된다. getactionbar().sethomebuttonenabled(true); 이코드는현재액티비티의액션바를얻고 (getactionbar()) 상단왼쪽에있는아이콘을클릭했을때애플리케이션홈으로이동할수있게해주는코드다. 그렇기때문에이코드가적용되면 onop tionsitemselected() 메소드에서왼쪽상단아이콘의클릭을감지할수있다. 클릭했을때넘어오는아이디는 android.r.id.home 이다. 일반적으로홈으로이동하게하며원한다면다른처리를추가할수도있다. 그림 5-7 메뉴에대해서는이미 제 4 부안드로이드기초 메뉴 에서살펴보았지만, 더자세히알고싶다면 다음링크를참고하기바란다. URL http://developer.android.com/guide/topics/resources/menu-resource.html

SECTION 01 _ 액션바 (ActionBar) 415 액션바옵션살펴보기 액션바를보이거나숨기기 참고프로젝트 ActionBarDemoB1 액션바는현재화면위치와관련된메뉴를보여줄수있어매우유용하지만, 경우에따라서는액션 바로인해더많은정보를보여줄수없는경우도있다. 그러므로이런경우에는액션바를숨겨서화 면을좀더넓게사용해야할필요가있다. 그림 5-8 액션바를숨긴화면 액션바를숨긴후에도원한다면다시보이게할수있다. 숨길때는 ActionBar 클래스의 hide() 라는메소드를호출하면되며, 보이게할때는 show() 메소드를호출하면된다. 현재액티비티의 ActionBar 객체는 getactionbar() 메소드를통해얻을수있다. 그러므로액션바를숨기거나보여주는코드는다음과같다. ActionBar actionbar = getactionbar(); actionbar.hide(); actionbar.show();

416 PART 05 _ 안드로이드활용 액션바에제목, 부제목설정하기 참고프로젝트 ActionBarDemoB2 액션바의왼쪽에는아이콘과현재액티비티의제목이보여진다. 그런데이제목만으로는해당화면을 충분히설명할수없는경우가있다. 이런경우에는다음처럼제목아래에부제목을추가할수있다. 그림 5-9 ActionBarDemoB2는제목이고, 이제목아래에있는 Subtitle of Action Bar는부제목이다. 이렇게하기위해서는 oncreate() 메소드에서 ActionBar 클래스의 setsubtitle() 메소드를호출하면된다. getactionbar().setsubtitle( Subtitle of Action Bar ); 기본적으로제목은 /res/values/strings.xml에선언되어있는 app_name이표시되지만, 원한다면직접제목을변경할수있다. 제목변경을하고싶을때사용하는메소드는 settitle() 이다. getactionbar().settitle( Action Bar ); 위코드를부제목를설정하는코드와함께호출하면다음과같은화면이출력된다. 그림 5-10 추가적으로제목과부제목이표시되는영역을보이지않게설정할수도있다. getactionbar().setdisplayshowtitleenabled(false); 다음은제목과부제목이사라지고아이콘만보이는모습이다. 그림 5-11

SECTION 01 _ 액션바 (ActionBar) 417 액션바의화면출력옵션설정하기 참고프로젝트 ActionBarDemoB3 액션바왼쪽에는아이콘과제목, 부제목을표시할수있다. 또한아이콘왼쪽에 < 표시를하여사용 자가아이콘을클릭해서이전화면으로이동할수있다는것을알려줄수도있다. 그림 5-12 이섹션에서는액션바왼쪽에아이콘, 제목등을표시할지말지를결정하는옵션들에대해서살펴보 도록하겠다. 가장먼저이를지정하는상수가 ActionBar 클래스에정의되어있다. 다음은이를정 리한것이다. CONSTANTS ActionBar 클래스에지정된액션바의화면출력옵션 상수 DISPLAY_USE_LOGO 설명홈아이콘대신에로고를사용할지를지정한다. 로고를사용하고싶다면로고이미지를 AndroidManifest.xml의 <application> 이나 <activity> 에 android:logo="@drawable/ androidside" 처럼작성해야한다. 관련메소드 setdisplayuselogoenabled(boolean uselogo) DISPLAY_SHOW_HOME 홈아이콘표시여부를지정한다. 관련메소드 setdisplayshowhomeenabled(boolean showhome) DISPLAY_HOME_AS_UP 홈아이콘왼쪽에 < 표시를하여사용자에게아이콘을클릭여부를알려줄지를지정 한다. 관련메소드 setdisplayhomeasupenabled(boolean showhomeasup) DISPLAY_SHOW_TITLE 제목, 부제목을표시여부를지정한다. 관련메소드 setdisplayshowtitleenabled(boolean showtitle)

418 PART 05 _ 안드로이드활용 상수 설명 DISPLAY_SHOW_CUSTOM 사용자정의뷰표시여부를지정한다. 관련메소드 setcustomview(...) setdisplayshowcustomenabled(boolean showcustom) DISPLAY_ 로시작하는상수들은액션바의화면옵션을지정하는것이며, 이를활성화시키거나비활성화시켜액션바의모양을우리가원하는대로변경할수있다. 이상수들의활성화여부는아래에서살펴볼 setdisplayoptions() 메소드로지정할수있으며, 이메소드를사용하지않고개별적으로지정할수도있다. 이메소드들을 관련메소드 라는항목으로위에정리해뒀으니함께살펴보기바란다. DISPLAY_ 로시작하는상수는액션바의일정영역을가리키고있는데이를그림으로정리해보면다음과같다. 그리고 DISPLAY_SHOW_TITLE을비활성화시키면액션바에는제목이보지이않게된다. 그림 5-13 DISPLAY_ 로시작하는상수를가지고활성화여부를지정하는메소드는다음과같다. 두개의메소 드가준비되어있는데인자가한개인메소드는지정된옵션만활성화하며인자가두개인메소드는 여러개의옵션을지정하여활성화할수있다. 다음표에자세히설명하였으니꼭읽어보기바란다. METHOD SUMMARY android.app.actionbar 클래스의 setdisplayoptions 메소드 final Cursor setdisplayoptions(int options) 화면출력옵션을설정한다. options에지정된옵션만활성화한다. 예를들어, setdisplayoptions (Ac tionbar.display_show_home) 를호출하면 DISPLAY_SHOW_HOME만활성화되며, setdisplay Options(ActionBar.DISPLAY_USE_LOGO ActionBar.DISPLAY_SHOW_HOME) 를호출하면 DISPLAY _USE_LOGO와 DISPLAY_SHOW_HOME가활성화된다.

SECTION 01 _ 액션바 (ActionBar) 419 매개변수 options ActionBar 클래스에지정된 DISPLAY_ 로시작하는상수들의조합 void setdisplayoptions(int options, int mask) 화면출력옵션을비트마스크를사용하여설정한다. 예를들어, setdisplayoptions(0, ActionBar.DIS PLAY_SHOW_HOME) 를호출하면 DISPLAY_SHOW_HOME만비활성화가되며, setdisplayoptions (ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_SHOW_HOME DISPLAY_USE_LOGO) 를호출하면 mask에선언된두개의옵션중에서 options에선언된 DISPLAY_SHOW_HOME은활성화되고그렇지않은 DISPLAY_USE_LOGO는비활성화된다. 매개변수 options ActionBar 클래스에지정된 DISPLAY_ 로시작하는상수들의조합 mask 화면출력옵션의비트마스크 TIP & TECH 액션바에아이콘대신에로고를지정할때액션바에서아이콘대신에로고를표시하기위해서는 setdisplayoptions() 메소드를어떻게호출해야할까? 아마도다음코드처럼작성하면될거라고생각할것이다. setdisplayoptions(actionbar.display_use_logo) 언뜻보기에이코드는로고를사용해라라고지정하는것이맞다고생각할것이다. 하지만막상코드를이렇게작성하고실행해보면화면에아무것도나오지않는다. 그래서이를해결하기위해 AndroidManifest.xml에 logo가제대로지정되었는지, 이미지는문제가없는지확인해볼것이다. 하지만이부분도문제가없다는것을이내깨닫고한숨을연거푸내쉬는개발자를본적이있다. 무엇이문제일까? 이문제를해결하기위해서는 setdisplayoptions() 메소드는지정된옵션만활성화시키는것이고, 아이콘이나로고를표시하는홈영역은 DISPLAY_SHOW_HOME로지정한다는것을유념해야한다. 결국, 로고를사용하고싶다면 DISPLAY_USE_LOGO만을활성화시킬것이아니라 DISPLAY_SHOW_HOME도함께활성화시켜야하는것이다. 다음코드가바로우리가원하는코드다. setdisplayoptions(actionbar.display_show_home ActionBar.DISPLAY_USE_LOGO); 그림 5-14 액션바에로고를표시한화면 지금까지살펴본내용을기반으로간단한예제를작성해보겠다. 대표적인화면출력옵션을변경할수있도록버튼을추가하고이버튼을통해액션바의왼쪽영역을변경해보겠다.

420 PART 05 _ 안드로이드활용 그림 5-15 버튼 4 개를추가해야하므로레이아웃은다음처럼구성하도록한다. CODE 레이아웃 XML - /res/layout/main.xml <?xml version= 1.0 encoding= utf-8?> <LinearLayout xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= fill_parent android:layout_height= fill_parent android:orientation= vertical > <Button android:id= @+id/display_home_as_up android:layout_width= fill_parent android:layout_height= wrap_content android:text= DISPLAY_HOME_AS_UP DISPLAY_SHOW_HOME /> <Button android:id= @+id/display_show_home android:layout_width= fill_parent android:layout_height= wrap_content android:text= DISPLAY_SHOW_HOME /> <Button android:id= @+id/display_use_logo android:layout_width= fill_parent

SECTION 01 _ 액션바 (ActionBar) 421 android:layout_height= wrap_content android:text= DISPLAY_USE_LOGO DISPLAY_SHOW_HOME /> <Button android:id= @+id/display_show_title android:layout_width= fill_parent android:layout_height= wrap_content android:text= DISPLAY_SHOW_TITLE /> </LinearLayout> 레이아웃을작성했으니이제실제코드를작성해야한다. 먼저버튼을클릭했을때반응할수있도록 oncreate() 메소드에리스너를설정한다. 그리고 onclick() 메소드에서사용자가클릭한버튼의종 류에따라화면출력을적당히변경하도록한다. CODE Main.java package com.androidside.actionbardemob3; import android.app.actionbar; import android.app.activity; import android.os.bundle; import android.view.view; public class Main extends Activity implements View.OnClickListener { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); findviewbyid(r.id.display_home_as_up).setonclicklistener(this); findviewbyid(r.id.display_show_home).setonclicklistener(this); findviewbyid(r.id.display_use_logo).setonclicklistener(this); findviewbyid(r.id.display_show_title).setonclicklistener(this); @Override public void onclick(view v) { switch (v.getid()) { case R.id.DISPLAY_HOME_AS_UP : getactionbar().setdisplayoptions( ActionBar.DISPLAY_HOME_AS_UP ActionBar.DISPLAY_SHOW_HOME); break; case R.id.DISPLAY_SHOW_HOME : getactionbar().setdisplayoptions(actionbar.display_show_home);

422 PART 05 _ 안드로이드활용 break; case R.id.DISPLAY_USE_LOGO : getactionbar().setdisplayoptions( ActionBar.DISPLAY_USE_LOGO ActionBar.DISPLAY_SHOW_HOME); break; case R.id.DISPLAY_SHOW_TITLE : getactionbar().setdisplayoptions(actionbar.display_show_title); break; 여기서주의깊게보아야할것은 onclick() 메소드에있는 setdisplayoptions() 메소드다. 이코드에서사용한메소드는한개의인자만받는메소드이며, 이메소드는지정된옵션만을활성화시키고나머지화면옵션은모두비활성화시킨다. 그러므로 setdisplayoptions(actionbar. DISPLAY_HOME_AS_UP) 처럼코드를작성하면화면에아무것도보이지않는다. 왜냐하면 DIS PLAY_HOME_AS_UP 옵션은홈아이콘이있을경우에만적용되는옵션이기때문이다. 그래서두개의옵션이모두적용될수있도록 ActionBar.DISPLAY_HOME_AS_UP ActionBar.DIS PLAY_SHOW_HOME처럼지정해야한다. 마지막으로 AndroidManifest.xml에로고이미지를추가한다. 로고를사용하지않는다면몰라도이예제에서는로고출력을하고있으므로 android:logo에이미지를지정해야한다. android:logo 는 <application> 이나 <activity> 에지정할수있다. 이예제에서는 안드로이드사이드 로고를지정했다. 필자는이예제에서 안드로이드사이드 로고를 /res/drawable-hdpi에추가했다. CODE AndroidManifest.xml <?xml version= 1.0 encoding= utf-8?> <manifest xmlns:android= http://schemas.android.com/apk/res/android package= com.androidside.actionbardemob3 android:versioncode= 1 android:versionname= 1.0 > <uses-sdk android:minsdkversion= 15 /> <application android:icon= @drawable/ic_launcher android:label= @string/app_name > <activity android:name=.main

SECTION 01 _ 액션바 (ActionBar) 423 android:label= @string/app_name android:logo= @drawable/androidside > <intent-filter> <action android:name= android.intent.action.main /> <category android:name= android.intent.category.launcher /> </intent-filter> </activity> </application> </manifest> 액션뷰추가하기 액션바에사용자정의뷰추가하기 참고프로젝트 ActionBarDemoC1 액션바에는액션아이템이라불리는메뉴를추가해서사용자의편의를제공할수있다. 하지만메뉴는단지메뉴일뿐이므로버튼등의다른뷰를액션바에추가해야하는경우도있을수있다. 그래서이섹션에서는액션바에우리가원하는뷰를어떻게추가할수있는지를살펴보도록하겠다. 액션바를생성하고, 액션바에가장대표적뷰인버튼을추가하고, 버튼을클릭했을때 Toast로메시지를화면에보이게하겠다. 그림 5-16

424 PART 05 _ 안드로이드활용 이렇게작성하기위해서는가장먼저버튼을배치할레이아웃을작성해야하며, 그다음에액션바에사용자정의뷰를사용하겠다고선언해야한다. 그리고버튼을클릭했을때메시지를보여줄수있도록코드를작성해야한다. 절차를정리하면다음과같다. (1) 사용자정의뷰 ( 버튼레이아웃 ) 작성 - /res/layout/mybutton.xml (2) 사용자정의뷰 ( 버튼레이아웃 ) 액션바에배치 - setcustomview() 메소드 (3) 사용자정의뷰 ( 버튼레이아웃 ) 활성화 - setdisplayshowcustomenabled() 메소드 (4) Toast 메시지코드작성 - Toast 클래스가장먼저 main.xml을생성해야하는데, 이예제에서는특별히추가할것이없으므로기본생성파일을그대로사용하겠다. 그러므로우리가작성해야할레이아웃은버튼을배치할레이아웃단한개뿐이다. CODE 레이아웃 XML - /res/layout/mybutton.xml <?xml version= 1.0 encoding= utf-8?> <LinearLayout xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= match_parent android:layout_height= match_parent android:orientation= horizontal > <Button android:id= @+id/mybutton1 android:layout_width= wrap_content android:layout_height= wrap_content android:text= BUTTON1 /> <Button android:id= @+id/mybutton2 android:layout_width= wrap_content android:layout_height= wrap_content android:text= BUTTON2 /> <Button android:id= @+id/mybutton3 android:layout_width= wrap_content android:layout_height= wrap_content android:text= BUTTON3 /> </LinearLayout>

SECTION 01 _ 액션바 (ActionBar) 425 버튼레이아웃을작성했으니이제액션뷰에이버튼레이아웃을설정하고활성화하면된다. CODE Main.java package com.androidside.actionbardemoc1; import android.app.actionbar; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.toast; public class Main extends Activity implements View.OnClickListener { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); View mybuttonlayout = getlayoutinflater().inflate(r.layout.mybutton, null); mybuttonlayout.findviewbyid(r.id.mybutton1).setonclicklistener(this); mybuttonlayout.findviewbyid(r.id.mybutton2).setonclicklistener(this); mybuttonlayout.findviewbyid(r.id.mybutton3).setonclicklistener(this); ActionBar actionbar = getactionbar(); actionbar.setcustomview(mybuttonlayout); actionbar.setdisplayshowcustomenabled(true); @Override public void onclick(view v) { Toast.makeText(this, Button clicked + ((Button)v).getText(), Toast.LENGTH_SHORT).show(); View mybuttonlayout = getlayoutinflater().inflate(r.layout.mybutton, null); 작성한버튼레이아웃을액티비티에서사용하기위해서는인플레이션작업이필요하다. mybuttonlayout.findviewbyid(r.id.mybutton1).setonclicklistener(this); 인플레이션한 mybutton.xml 의버튼들을찾아서클릭리스너를등록한다.

426 PART 05 _ 안드로이드활용 ActionBar actionbar = getactionbar(); actionbar.setcustomview(mybuttonlayout); 액션바에버튼레이아웃을설정한다. actionbar.setdisplayshowcustomenabled(true); 버튼레이아웃을활성화한다. 기본적으로액션바에뷰를추가하는것은매우단순한일이므로실제애플리케이션을작성할때중요하게생각할것은액션바에직접정의한뷰의기능을정의하는것이다. 이기능정의는대부분클릭이벤트에의해처리될것이므로 onclick() 메소드를잘정의하면된다. 액션바에사용자검색뷰추가하기 참고프로젝트 ActionBarDemoC2 이전섹션에서사용자가직접작성한뷰를액션바에추가했다. 이와다르게이미제공되는액션뷰를 추가할수도있다. 이중에서가장활용도가높은것이검색뷰다. 이검색뷰는주로액션뷰로사용하 기는하지만위젯의일종이기때문에다른곳에사용해도된다. 그림 5-17 이그림에서보이는상단오른쪽에있는검색뷰는검색입력을바로할수있게검색입력창을보일수도있고, 돋보기아이콘만먼저보이고사용자가클릭했을때검색입력창을보이게할수도있다. 이섹션에서는이러한검색뷰를액션바에추가하고이와관련된속성들을살펴보도록하겠다. 액션뷰는액션바에서는메뉴로동작하기때문에작업순서는다음과같다. (1) 메뉴파일에검색뷰선언하기 - /res/menu/main.xml (2) 액티비티에서검색뷰속성설정하기일단기본프로젝트를생성한후에수정해야할파일은딱두가지다. /res/menu 디렉터리에 main. xml을생성하고, 이파일에다음처럼검색뷰를메뉴로선언한다. 이렇게선언한메뉴는액션바에서액션뷰의형태로동작하게된다.

SECTION 01 _ 액션바 (ActionBar) 427 CODE 메뉴 XML - /res/menu/main.xml <?xml version= 1.0 encoding= utf-8?> <menu xmlns:android= http://schemas.android.com/apk/res/android > <item android:id= @+id/menu_search android:title= @string/menu_search android:icon= @android:drawable/ic_menu_search android:actionviewclass= android.widget.searchview /> </menu> 액션아이템을액션뷰로선언하는방식은두가지가있다. 위에서선언한 actionviewclass 속성에액션뷰로사용할클래스를직접지정하는방식과 actionlayout 속성에액션뷰로사용할레이아웃을지정하는방식이있다. (1) actionviewclass 속성사용 actionviewclass 속성을사용하는방식은매우단순하다. 이속성에액션뷰로사용할클래스를다음처럼패키지명을포함하여지정하기만하면된다. 물론지정하는위젯이액션뷰로사용할수있도록미리준비되어있어야한다. 이러한뷰들이많이준비되어있으면좋겠지만아쉽게도현재는검색뷰 (SearchView) 밖에없다. android:actionviewclass= android.widget.searchview (2) actionlayout 속성사용 actionlayout 속성에레이아웃위치를지정하고이레이아웃에검색뷰를지정하는방식이다. 그러므로가장먼저 /res/layout 디렉터리에 mysearch.xml를생성해서 SearchView 위젯을선언해야한다. CODE 레이아웃 XML - /res/layout/mysearch.xml <?xml version= 1.0 encoding= utf-8?> <SearchView xmlns:android= http://schemas.android.com/apk/res/android android:layout_width= wrap_content android:layout_height= match_parent /> 그리고메뉴레이아웃의 actionlayout 에방금작성한레이아웃을지정하면된다.

428 PART 05 _ 안드로이드활용 CODE 메뉴 XML - /res/menu/main.xml <?xml version= 1.0 encoding= utf-8?> <menu xmlns:android= http://schemas.android.com/apk/res/android > <item android:id= @+id/menu_search android:title= @string/menu_search android:icon= @android:drawable/ic_menu_search android:actionlayout= @layout/mysearchview /> </menu> 두번째방식은별도의레이아웃을생성해야하는번거로움이있지만액션뷰로사용할레이아웃을따로관리할수있다는장점도있다. 그러나필자는별도의파일을생성하지않아도되는첫번째방식을선호한다. 액션아이템을선언했다면이제액티비티를작성해야한다. 먼저액티비티전체코드를살펴보겠다. CODE Main.java package com.androidside.actionbardemoc2; import android.app.activity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.widget.searchview; import android.widget.searchview.onquerytextlistener; public class Main extends Activity implements OnQueryTextListener { private final boolean IS_ICON_ITEM = true; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); @Override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.main, menu); MenuItem searchmenu = menu.finditem(r.id.menu_search); SearchView searchview = (SearchView) searchmenu.getactionview();

SECTION 01 _ 액션바 (ActionBar) 429 searchview.setonquerytextlistener(this); searchview.setsubmitbuttonenabled(true); searchview.setqueryhint( input query hint ); if (IS_ICON_ITEM) { searchmenu.setshowasactionflags(menuitem.show_as_action_if_room MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); else { searchmenu.setshowasactionflags(menuitem.show_as_action_if_room); searchview.seticonifiedbydefault(false); return true; @Override public boolean onquerytextchange(string newtext) { return false; @Override public boolean onquerytextsubmit(string query) { return false; 작성한액티비티는검색뷰를보여주기만하므로검색어를입력하고검색버튼을클릭해도어떤반응도하지않는다. Main 클래스상단에선언되어있는 IS_ICON_ITEM 상수는검색뷰를아이콘으로표시할지, 아니면검색창으로표시할지를지정하는불린값이다. 이값을변경해서실행한화면은다음과같다. (1) IS_ICON_ITEM = true IS_ICON_ITEM 을 true 로지정한다는것은아이콘으로만표시하겠다는것이고이값에의해다음 과같은코드가실행된다. searchmenu.setshowasactionflags(menuitem.show_as_action_if_room MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); setshowasactionflags() 메소드는액션아이템의형태및표시방식을지정하는메소드이며, 여 기서는액션뷰가이메소드에의해설정된다. 이에대한설명은이전에살펴본 액션바에메뉴추가 하기 를참고하기바란다.

430 PART 05 _ 안드로이드활용 IS_ICON_ITEM 이 true 일경우에는다음처럼오른쪽에검색아이콘이표시된다. 그리고검색버튼 을클릭하면검색창이보이게된다. 그림 5-18 그림 5-19 왼쪽아이콘을클릭하면검색아이콘만보이는화면으로돌아간다. (2) IS_ICON_ITEM = false; IS_ICON_ITEM 을 false 로지정한다는것은액션바에검색아이콘이아닌검색창을표시하겠다는 의미다. 그러므로이값에의해다음코드가실행된다. searchmenu.setshowasactionflags(menuitem.show_as_action_if_room); searchview.seticonifiedbydefault(false); 두개의코드중에서첫번째코드는이전에이미살펴본내용이고, 두번째코드의 seticonified- ByDefault() 메소드는아이콘표시여부를설정하는메소드다. 그러므로이메소드에 false 로지정 하여검색아이콘만표시되게하였다. 그림 5-20 getmenuinflater().inflate(r.menu.main, menu); MenuItem searchmenu = menu.finditem(r.id.menu_search); 이코드는 /res/menu/main.xml에있는메뉴아이템을자바코드에서사용하기위한코드다. 첫번째코드의 inflate() 메소드는 xml에선언된메뉴를자바코드에서사용할수있도록해주며, finditem() 메소드는 xml에선언된메뉴아이템중에서원하는메뉴아이템을찾아주는메소드다. SearchView searchview = (SearchView) searchmenu.getactionview(); getactionview() 메소드는메뉴아이템에선언된검색뷰의객체를생성해준다.

SECTION 01 _ 액션바 (ActionBar) 431 지금까지액션바에사용자검색뷰를추가하는방법에대해서살펴보았다. 어렵지않은내용이지만 기존개발자들에게는생소한내용이므로관련된메소드와속성들에대해서차분히살펴볼필요가 있다. TIP & TECH 액션바의 iconifiedbydefault 속성과 showasaction 속성의관계 android:iconifiedbydefault 속성은액션아이템을아이콘으로표시하는속성이며, android:showasaction 속성은액션아이템의표시여부와표시형태를지정하는속성이다. 그런데이두개의속성이서로밀접한관계를형성하고있기때문에속성을제대로이해하고사용할필요가있다. 예를들어, showasaction을지정하지않고 iconifiedbydefault만 true로지정한다면어떻께될까? 일반적으로아이콘으로표시가될것이라고생각하겠지만액션바에아이콘이표시되지않는다. 왜냐하면 showasaction의디폴트속성은액션바에어떤것도표시하지않는것이기때문이다. 그러므로이둘의연관관계를이해하고코드를작성해야한다. 물론이에대한설명은이책에서모두다뤘으므로액션바의메뉴부분과방금살펴본코드들을다시한번살펴보면될것이다. 이속성들과관련된자바메소드 setshowasactionflags() 와 seticonifiedbydefault() 에대해서도주의깊게살펴보기바란다. 내비게이션모드종류살펴보기 액션바는안드로이드 3.0 이후부터는매우유용한영역이다. 이영역을잘활용하면태블릿을포함한어떤기기에서도사용자가해당애플리케이션의기능을쉽게다루도록할수있다. 지금까지는액션바에액션아이템 ( 메뉴 ) 만을포함하고있었지만, 이섹션에서는탭이나리스트를통해사용자가애플리케이션을탐색할수있는기능인내비게이션모드에대해살펴보겠다. 액션바에서제공하는내비게이션모드에는표준모드, 탭모드, 그리고리스트모드이렇게 3가지가있다. (1) 표준모드 (NAVIGATION_MODE_STANDARD) 액션바에탭이나리스트를포함하지않은내비게이션모드를말한다. 이모드는지금까지살펴본액 션바의형태를가지며, 내비게이션모드를별도로지정하지않을경우자동으로지정되는모드다. 그림 5-21 (2) 탭모드 (NAVIGATION_MODE_TABS) 액션바에탭메뉴를추가하여사용자가애플리케이션의기능을쉽게활용할수있도록해주는내비

432 PART 05 _ 안드로이드활용 게이션모드다. 이모드를사용하더라도오른쪽끝에액션아이템 ( 메뉴 ) 을추가할수있는것은변 함없다. 그림 5-22 (3) 리스트모드 (NAVIGATION_MODE_LIST) 액션바에리스트메뉴를추가하여사용자가애플리케이션을쉽게탐색할수있도록해주는내비게이 션모드다. 이모드에서도당연히오른쪽에액션아이템을추가할수있다. 그림 5-23 내비게이션모드를설정하는메소드는 ActionBar 클래스에정의되어있는 setnavigationmode() 메소드다. 이메소드에원하는내비게이션모드를지정해서호출하면된다. METHOD SUMMARY android.app.actionbar 클래스의내비게이션관련메소드 void setnavigationmode(int mode) 액션바의내비게이션모드를설정한다. 매개변수 mode NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS 이섹션에서는표준모드를제외한탭모드와리스트모드에대해서살펴보도록하겠다. 필자가생각하기에액션바의핵심은바로이내비게이션모드이며, 이를얼마나잘활용하냐에따라애플리케이션의편의성이달라진다고생각한다.

SECTION 01 _ 액션바 (ActionBar) 433 탭 (Tab) 모드살펴보기 참고프로젝트 ActionBarDemoE1 이섹션에서는액션바에 3 개의탭을추가하고탭을클릭했을때 Toast 를보이게할것이다. 액션아 이템을액션바오른쪽에추가할수도있지만예제가복잡해질수있으므로탭과관련된코드만작성 할것이다. 일단태블릿과스마트폰화면에서탭이어떻게나오는지보도록하자. 그림 5-24 액션바의탭모드 - WVGA(800 * 480) 그림 5-25 액션바의탭모드 - WXGA(1280 * 800)

434 PART 05 _ 안드로이드활용 스마트폰화면 (WVGA) 에서는탭이액션바영역아래에표시되는것을알수있다. 이렇듯태블릿과폰화면에서표시되는영역이다르므로애플리케이션화면기획시에이러한부분들을잘확인해야할것이다. 이예제는액티비티의자바코드만수정하면되므로기본프로젝트를생성해서 Main.java를다음과같이수정하도록하자. CODE Main.java package com.androidside.actionbardemoe1; import android.app.actionbar; import android.app.actionbar.tab; import android.app.actionbar.tablistener; import android.app.activity; import android.app.fragmenttransaction; import android.os.bundle; import android.widget.toast; import com.androidside.actionbardemoe1.r; public class Main extends Activity implements TabListener { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); ActionBar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_tabs); actionbar.addtab(actionbar.newtab().settext( Tab1 ).settablistener(this)); actionbar.addtab(actionbar.newtab().settext( Tab2 ).settablistener(this)); actionbar.addtab(actionbar.newtab().settext( Tab3 ).settablistener(this)); @Override public void ontabreselected(tab tab, FragmentTransaction ft) { Toast.makeText(this, tab.gettext() + ontabreselected, Toast.LENGTH_SHORT).show(); @Override public void ontabselected(tab tab, FragmentTransaction ft) { Toast.makeText(this, tab.gettext() + ontabselected, Toast.LENGTH_SHORT).show();

SECTION 01 _ 액션바 (ActionBar) 435 @Override public void ontabunselected(tab tab, FragmentTransaction ft) { Toast.makeText(this, tab.gettext() + ontabunselected, Toast.LENGTH_SHORT).show(); 코드의주요부분을하나씩살펴보도록하겠다. actionbar.setnavigationmode(actionbar.navigation_mode_tabs); 현재의액션바의내비게이션모드를탭모드 (NAVIGATION_MODE_TABS) 로설정하겠다는의미다. 여기서지정한탭모드와관련된상수 NAVIGATION_MODE_TABS는 ActionBar 클래스에선언되어있다. actionbar.addtab(actionbar.newtab().settext( Tab1 ).settablistener(this)); addtab() 메소드는새로생성한탭을액션바의탭으로지정하겠다는것이며, newtab() 메소드는탭을새로생성하겠다는것이다. 그리고 settablistener() 메소드는탭에리스너를등록하여클릭등의이벤트를처리하겠다는것이다. 코드에익숙하지않을경우이코드가매우복잡해보일수있지만, 대부분의개발자들은코드를이렇게작성하므로익숙해져야할것이다. 이코드를쉽게풀어작성하면다음과같다. Tab tab1 = actionbar.newtab(); tab1.settext( Tab1 ); tab1.settablistener(this); actionbar.addtab(tab1); METHOD SUMMARY android.app.actionbar 클래스의내비게이션탭생성및추가메소드 ActionBar.Tab newtab() 새로운 ActionBar.Tab 을생성하고반환한다. 생성한탭은 addtab() 메소드가호출되기전까지는 액션바에추가되지않는다. 반환 새로생성한 ActionBar.Tab

436 PART 05 _ 안드로이드활용 void addtab(actionbar.tab tab) 액션바에지정된 tab 을추가한다. 매개변수 tab 액션바에포함할탭 public class Main extends Activity implements TabListener { 액션바에탭을추가하는것이기때문에탭을클릭했을때이를감지해서적당한처리를하는것이필요하다. 그렇기때문에 TabListener 인터페이스의메소드를구현할필요가있다. TabListener 를 implements로선언하고, Main 클래스내부에 ontabreselected(), ontabselected(), 그리고 ontabunselected() 메소드를작성하면된다. 이메소드에대한설명은다음표를참고하기바란다. METHOD SUMMARY android.app.actionbar 클래스의내비게이션탭이벤트메소드 void ontabreselected(actionbar.tab tab, FragmentTransaction ft) 선택된탭이다시선택되었을때호출된다. 매개변수 tab 다시선택된탭 ft 프래그먼트처리담당클래스 void ontabselected(actionbar.tab tab, FragmentTransaction ft) 탭이선택된상태가되었을때호출된다. 매개변수 tab 선택된탭 ft 프래그먼트처리담당클래스 void ontabunselected(actionbar.tab tab, FragmentTransaction ft) 탭이선택된상태가해지되었을때호출된다. 매개변수 tab 선택해지된탭 ft 프래그먼트처리담당클래스 FragmentTransaction 클래스에대해서는프래그먼트부분에서살펴볼것이므로여기서는이런게있구나정도로생각하기바란다.

SECTION 01 _ 액션바 (ActionBar) 437 리스트 (List) 모드살펴보기 참고프로젝트 ActionBarDemoE2 이섹션에서는액션바에리스트를추가하고클릭했을때 Toast 메시지를화면에출력하도록하겠다. 다음두화면은태블릿크기와스마트폰크기에서보여지는액션바의리스트모양이다. 주의해서봐 야할부분은리스트가액션바에표시되었다는것이다. 그림 5-26 액션바의리스트모드 - WVGA(800 * 480) 그림 5-27 액션바의리스트모드 - WXGA(1280 * 800)

438 PART 05 _ 안드로이드활용 이렇게만들기위한절차는다음과같다. (1) 리스트에표현할문자열배열작성 - /res/values/strings.xml (2) 문자열배열로 SpinnerAdapter 생성 (3) 액션바에 SpinnerAdapter 설정가장먼저리스트에표시할문자열배열을생성해야한다. 다음처럼 strings.xml에 <string-array> 를선언하면된다. CODE 문자열 XML - /res/values/strings.xml <?xml version= 1.0 encoding= utf-8?> <resources> <string name= hello >Hello World, Main!</string> <string name= app_name >ActionBarDemoE2</string> <string-array name= action_list > <item>item 1</item> <item>item 2</item> <item>item 3</item> </string-array> </resources> 이제선언된문자열배열을액션바의리스트로표시할액티비티를작성하면된다. 일단전체코드를 보도록하자. CODE Main.java package com.androidside.actionbardemoe2; import android.app.actionbar; import android.app.activity; import android.os.bundle; import android.widget.arrayadapter; import android.widget.spinneradapter; import android.widget.toast; public class Main extends Activity implements ActionBar.OnNavigationListener {

SECTION 01 _ 액션바 (ActionBar) 439 @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); SpinnerAdapter spinneradapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.r.layout.simple_spinner_dropdown_item); ActionBar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_list); actionbar.setlistnavigationcallbacks(spinneradapter, this); @Override public boolean onnavigationitemselected(int itemposition, long itemid) { String[] actions = getresources().getstringarray(r.array.action_list); Toast.makeText(this, actions[itemposition], Toast.LENGTH_SHORT).show(); return true; 주요코드에대해서하나씩살펴보도록하겠다. SpinnerAdapter spinneradapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.r.layout.simple_spinner_dropdown_item); SpinnerAdapter를 /res/values/strings.xml에선언한문자열배열인 action_list를사용해서생성한다. 이때문자열배열로 SpinnerAdapter를생성해야하므로 ArrayAdapter 클래스의 cre atefromresource() 메소드를사용했으며, 안드로이드에서기본으로제공하는레이아웃을사용하기위해 android.r.layout.simple_spinner_dropdown_item을지정했다. actionbar.setnavigationmode(actionbar.navigation_mode_list); 내비게이션모드를리스트형태로설정한다.

440 PART 05 _ 안드로이드활용 actionbar.setlistnavigationcallbacks(spinneradapter, this); spinneradapter를액션바에설정하고관련된이벤트를현재클래스에서처리할수있게한다. 이렇게 this를선언하기위해서는현재클래스 ( 액티비티 ) 가 ActionBar.OnNavigationListener를구현하고있어야한다. public class Main extends Activity implements ActionBar.OnNavigationListener { SpinnerAdapter 의이벤트를액션바에서처리할수있도록 ActionBar.OnNavigationListener 를 구현하고관련메소드인 onnavigationitemselected() 를작성한다. METHOD SUMMARY android.app.actionbar.onnavigationlistener 인터페이스의메소드 boolean onnavigationitemselected(int itemposition, long itemid) 내비게이션아이템을선택할때호출된다. 매개변수 itemposition 선택한아이템의위치 itemid 선택한아이템의아이디 (ID) 반환이벤트의처리여부 ( 처리하면 true, 그렇지않으면 false) TIP & TECH 액션바의리스트모드에서리스트의문자열이매우길때일반스마트폰화면에서리스트는액션바의아이콘과같은라인에표시되는반면에탭은액션바의아래에표시된다. 그런데만약리스트의내용이매우길경우에는어떻게될까? 매우길기때문에탭처럼액션바의아래에표시가될까? 실제로문자열을길게작성해서실행해보면액션바의제목이사라지고리스트가보이는것을알수있다. 또한리스트의내용이매우길때는일부분만보인다는것도알수있다. 이러한표시방식을이해하고있어야향후애플리케이션화면기획을할때시행착오를조금이나마줄일수있을것이다. 그림 5-28