메뉴

T아카데미 2010.07.03 14:39

 이번 시간에는 메뉴에 관한걸 안드로이드에서 어떻게 사용하는지에 대해 알아봤어요.

 메뉴 아이콘으로 쓰는 이미지는 다음과 같죠



메뉴의 UI를 나타내는 xml파일은 다음과 같아요
각각의 버튼을 하나의 아이템으로 해서 icon, title, id만 해주면 되죠.



메뉴버튼을 눌렀을 때의 콜백함수는 다음과 같죠. onCreate()는 딱 한번만 호출되고요 두번째 부터는 onPrepare() 가 불려요.
메뉴에는 옵션메뉴와 context메뉴가 있는데 옵션메뉴는 그냥 단말에서 메뉴버튼을 누르면 보이는 거고요
context 메뉴는 오래 누르고 있으면 나오는 거에요. 숫자에는 제한이 없죠. 다이얼로그로도 나올수 있고 형태는 여러 종류가 있어요.




메뉴를 누를때마다 메뉴의 아이콘을 계속 바꿔주도록 해 볼께요







메뉴의 아이템이 많아지면 더보기 버튼이 생겨요



메뉴의 아이템을 하나 선택했을 때 그 안의 서브메뉴를 보여줄 수도 있죠



뭔가 오래 누르고 있으면 나오는 context 메뉴도 만들어볼께요



context 메뉴의 label 문자도 바꿀수 있고요



context 메뉴안의 아이템이 선택되었을 때 할 동작도 콜백함수로 처리할 수 있어요



이번엔 하드웨어 키보드를 눌렀을 때랑 스마트폰에 제스처를 취했을 때 처리할 일을 구현해 볼께요



스마트폰을 쓰~~윽 Fling 했을 때 글자를 이동시키는 걸 해볼께요





신고

'T아카데미' 카테고리의 다른 글

쓰레드와 에니메이션  (0) 2010.07.07
데이터 저장 기초  (0) 2010.07.03
메뉴  (0) 2010.07.03
사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
Posted by 응큼미소

 이번 시간에는 Listview, TabView등 UI를 보이는데 중요한 위젯을 배웠어요. 그럼 List부터 시작할께요. 

 일단 List에 보여줄 객체를 생성해야 해요.







그런데 List의 각 아이템에있는 view에대한 id들을 매번 가져오면 메모리 활용면에 있어서 별로 좋지 않겠죠?
 그래서 view를 재활용하는 방법을 많이 써요. convertView를 이용하는 거죠





TextView를 하나 더 추가한 연습문제에요.
 각각의 아이템을 원하는 layout으로 바꿔줄수도 있는데요 이럴때는 Customized List를 사용해요. getView() 메소드는 새로운 View를
만들기도 하고 단지 데이터만 연결시켜 주기도 하는데요 새로운 View를 이 안에서 만들어서 각자 아이템의 특징을 틀리게 해 줄수가
있죠. 
 이렇게 xml파일은 두개가 필요한데요 하나는 전체 Activity에 사용하는 거고, 하나는 하나의 item에만 적용하는 거죠.
 
 레이아웃 Inflator라는 애도 있는데요 얘는 XML 레이아웃의 내용을 실제 뷰 객체들의 트리로 변환을 하죠. 얘는 Adapter에서
item에 대한 정보를 갖고있는 xml파일을 인스턴스 객체로 만들어서 사용하기 위해 쓰여요.





 각 List의 아이템을 클릭했을 때 할 일을 지정할 수도 있어요
 그냥 한번 클릭했을 때와 오래 클릭했을 때로 나누어 지죠.
 보통 오래클릭했을 때는 설정에 관한걸 많이 보여줘요







 GridView라는 것도 있는데요 이건 표 형식으로 아이템을 보여주죠. 구성은 ListView를 사용하는 것과 동일해요. 하지만 한줄에
여러개가 들어가기 때문에 Colums를 넣어야 하죠. 속성중에 android:numColumns가 있는데 이 속성값을 auto_fit으로 하면
안드로이드는 여유공간이 얼마나 있는지와 나머지 속성들의 값을 참조해서 자동으로 결정해요. spacing 속성을 이요해서는 여백을
줄수 있죠. 여기서는 spinnerview에 맞게 시스템에서 미리 정해놓은 layout을 추천할께요. 바로 simple_spinner_item이에요.
 이렇게 안드로이드 시스템의 내장 레이아웃을 사용할 때도 많은데요 얘네는 보통 android.R 이렇게 시작되죠. 최소한 손가락이 누르기
좋은 크기로 알아서 만들어 줘요. 
 App 내에서 날짜 설정하는 경우도 많기 때문에 날짜/시간 선택기능 위젯도 있죠.
 



comboBox처럼 보여주는 위젯도 있어요. spinner가 그렇죠. list에서 layout을 두가지로 나눠보자고 하면
List에 표시되는 Layout과 다이얼로그에 표시되는 layout이 있어요. 다이얼로그로 표시되는 layout을 spinner라고 하죠.


AutoCompleteTextView라는 것도 있어요. 사용자의 입력을 받으면서 동시에 자동완성을 해 주는 거죠. 이것도 List에서 등용이 되서
쓰이는 거라 Adapter 등으로 처리해 줘요.
 Gallery라는 것도 있는데요 얘는 사진과 같은 것들을 볼수 있는 간편한 기능을 제공하는데요, View들이 수평으로 쭈욱 이동되는 거죠.
이것도 일종의 Adapter View라고 볼 수 있어요.

나중에 twitter와 관련된 프로젝트를 하기위해 twitter가입도 했어요



TabView를 볼께요.
 뷰의 탭부분을 설정하는 데에는 3가지가 필요한데요 TabHost는 모두 아우르는 것으로 메인 컨테이너라고 할 수 있죠.
 TabWidget은 탭 버튼을 담고있는 한 아이템을 구현현 것으로 아이콘과 텍스트로 구성되요. 그리고 FrameLayout에 탭 내용이
담기게 되죠. 
 여기서 주의할게 있는데요 TabHost는 평소 하던데로 +id만 하면 되지만 이건 App만 아는거기 때문에 시스템은 잘 몰라요.
 그래서 만약 TabWidget과 FrameLayout까지 이런식으로 해버리면 시스템이 알아서 접근을 할수가 없죠.
 그래서 시스템이 여기에는 알아서 접근할 수 있도록 개발자와의 약속을 해놓은 @android:id/tabs 와 @android:id/tabcontent 를
이용해야 해요.
 일반적으로 텝위젯을 사용할 때는 Activity를 먼저 구현한 후에 TabActivity에 추가해 주는 순서로 해요.

 손잡이 잡아당기는 위젯은 SlidingDrawer Widget이라고 하죠.









웹킷을 이용해 웹사이트를 보여주는 WebView를 볼께요.
 안드로이드에선 Activity에서 바로 html 내용을 보여줄 수 있어요. 완벽하게 지원을 해주죠. 그리고 웹킷엔진을 사용해요.
 웹킷 엔진은 웹브라우저, 웹뷰 웬만한건 다 되죠. 주의할 점은 인터넷 연결권한(INTERNET)이 있어야 한다는 거죠. 연결방식은 어떤 연결방식을 사용하더라도 상관없어요. WiFi, 무선통신망, Bluetooth 뭐든지 말이죠.








 사용자에게 URL주소를 입력받아서 이용할 수도 있어요



진짜 웹브라우저랑 비슷하게 만들기 위해 웹브라우저의 공개된 소스를 보도록 할께요
 기본 App에 있는걸 내가 처리하고 싶으면 이렇게 오픈소스를 다운받아서 하면되요.
 근데 여기서 문제점이 하나 발견되죠. onCreate() 메소드에 startActivity(ACTION_VIEW, "http://~~~") 이거를 해놓으면 웹에서
link를 클릭할 때마다 stack에 화면이 계속 쌓이게 되요. link된 화면으로 넘어가지 않죠. 그래서 Activity 하나가 startActivity 를 모두
처리하게 해야 하는데요 onNewIntent() 를 이용하면 되요. getIntent에서는 처음 StartActivity 만 처리하고 두번째 부터는
onNewIntent() 가 호출되기 때문이죠. 그런데 이 특징이 적용되게 할라면 manifest 파일에서 런치모드를 singleTask 로 해야해요.
 이렇게 되면 처음에 Activity는 버튼으로 웹킷을 사용하지만 그 다음 두,세번째 부터는 넘어온 URi로 웹킷을 사용하는 거죠.









intent filter부분을 참고해서 이용하면 되겠죠?



그렇게 되면 intent-filter가 두개기 때문에 어떤 application으로 처리할지 선택하는 다이얼로그가 나오죠



우리가 만든 인텐트를 받도록 설정해 볼께요





그런데 한번 웹킷을 사용했다가 다시 접속하려고 하면 페이지를 넘어가지 않아요. 새로운 인텐트를 처리하도록 하지 않았기 때문인데요, onCreate에서 가져온 인텐트로는 새로운걸 처리할 수 없죠. 그래서 onNewIntent라는 콜백메소드를 만들어야 해요.









신고

'T아카데미' 카테고리의 다른 글

데이터 저장 기초  (0) 2010.07.03
메뉴  (0) 2010.07.03
사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
Posted by 응큼미소
 이번시간에는 애플리케이션의 구성요소인 서비스와 브로드케스트리시버를 공부했어요. 하지만 서비스는 이미지를 남길수가 없었죠. 그래도 필기해놓은게 있으니 곧 설명을 남길께요.

서비스라는 애는 UI가 없이 뭔가 background에서 조용히 일처리를 하고 사라져요. 이런 서비스를 통해서 IPC를 구현할 수도
있는데요 서로다른 Process 사이를 연동시키는 거죠. binder라는 서비스가 이런걸 해 줘요.
 그냥 startService() 만 하면요 별도의 쓰레드는 만들지 않아요. 하지만 CPU를 많이 쓰거나 대기 상태를 요구하는 서비스는
별도의 쓰레드를 만들 필요가 있죠. 그럴때는 bindService() 를 호출해요. IPC를 담당하는 서비스는 보통 이렇게 하죠. 이 쓰레드
를 잘 사용해야 사용자들이 체감속도를 좋게 느낄 수 있어요.
 Service도 LifeCycle 이 있어요. 하지만 Activity와는 좀 틀리죠. 화면에 보이는게 없으니깐 당연히 그렇겠죠. 그래서 resume,
pause, start, stop 이 필요없어요. 그리고 startService는 여러번 호출해도 서비스는 하나만 생겨요. 서비스는 Activity같이 
stack에 쌓이고 이런게 아니라 백그라운드에 하나만 생기는 거기 때문에 그렇죠. 서비스는 stopself()를 통해 Destroy 시킬 수 
있어요.

 나중에 보게 되겠지만 content provider가 있는데요, 얘는 내부적으로 갖고있는 데이터를 다뤄요. A가 만든 데이터를 B가 접근
하는 건 불가능 한데요 그래도 공유하고 싶을 때가 있죠. 전화번호부나 사진 같은거요. 이 때 content provider를 사용해서 SQLite
를 이용해요. 이런걸 SendBox Model 이라고도 하죠.

그럼 브로드케스트리시버부터 볼께요. 얘를 통해서 메일도착, 날짜, 위치이동 등의 정보를 App에게 알려줄 수 있어요.
브로드캐스트리시버는 다른 App도 관심이 있을 만한 이벤트를 뿌려주죠. 그리고 registerReceiver메소드를 이용하면
런타임시 실행코드 상에서 관심이 있다고 등록할 수 있어요.
 브로드캐스트리시버는 onReceive() 콜백 함수만 구현하면 되는데요 받았다는 것만 표시하고 바로 내려가는 간단한 작업을
하게 되죠. 그래서 오래걸리는 작업이라면 Service에게 맡기는게 좋아요.
 지금 메모리에 떠있는 App에게만 주는 이벤트도 있는데요 예를 들어 1분마다 바뀐 시간을 알려주는 이벤트에요.
모든 App에게 1분마다 이벤트를 보내주면 시스템에 엄청 과부하가 걸리겠죠. 그런 애들을 꼭 registerReceiver를 이용해서
메모리에 떠있는 애만 받도록 등록해야 해요.
 App는 어떤 브로드캐스트에 관심이 있다고 intent-filter에 등록을 해야하죠. 그래서 만약 SMS가 왔을 때 알려줄 수 있는
App가 올라와있지 않다면 시스템이 알아서 App올려주고 브로드캐스트를 부르게 되죠. 

 여러 브로드캐스트가 왔을 때 순차적으로 실행하도록 할 수도 있어요. sendOrderedBroadcase()메소드를 이용하면 가능하죠.
 이런게 왜 필요하냐면요 스팸차단을 하고싶다고 해보죠. 근데 스팸차단은 sms 브로드캐스트와 전화가 오는 브로드캐스트 등을
보고 스팸차단을 해서 그런 브로드캐스트를 막아야겠죠? 이런 경우에 순차 브로드캐스트가 필요하죠. 그리고 어떤 패키지가 추가가 
되었는데 위험하다 등등을 알려주는 브로드캐스트 같은 경우도 우선순위가 높아야 겠죠?
 부팅이 되자마자 실행해야 할 브로드캐스트가 있을수도 있는데요 이럴때는 manifest 파일에 사용자의 permission 주는게 필요해요.
BOOT_COMPLETED라는 permission이 필요하죠.
 
 여기서 실수하기 쉬운게 있는데요 UI가 없는 Service나 broadcast는 Run Configuration에서 설정할 수 없죠.

여러 브로드케스트 예제를 쭈욱 보겠습니다.











content provider라는 애는 다른 App나 컴포넌트들이 데이터를 쉽게 공유할 수 있도록 해 주죠. 
Application이 직접 원격 저장소에 접근할 수 없기 때문에 content provider를 이용해서 간접적으로 접근하게 되죠.
접근할 데이터 셋을 지정할 때는 URI를 사용하는데요 "content://" 이렇게 시작하는 거죠. 어떤 컴포넌트던지 자신만의 URI
가 정해져 있어요. 이 URI를 이용해서 다양한 Activity를 띄우는게 가능하죠.  
SQLite 데이터베이스가 많이 쓰여요.


이제 ListView에 대해 알아보겠어요
 ListView는 고급 View중에서 가장 많이 사용되는 view에요. ListView에 대해서 알아보기 앞서
 고급 위젯에서 두루두루 쓰이는 구조가 바로 ListView, Adapter, Data인건 기억해야 해요.
 ListView는 똑같은 모양의 item들이 여러개 반복될 때 사용되요. 구지 Linear Layout을 써도 되는데 이걸 왜 쓰냐면요
Linear layout을 쓰면 메모리를 많이 쓰게 되거든요. 아이템이 몇만개가 있다고 생각해 보세요.
하지만 ListView는 몇 만개 까지도 처리할 수 있어요. 메모리가 재활용 되기 때문이죠. 맨위의 TextView가 없어지면
밑에 올라오는 TextView를 재활용해서 보여주죠. 어뎁터가 ListView와 backend를 연결해 줘요.
 ListView는 하나이고 각각의 TextView (itemView)는 여러개 인데요 이 아이템들을 재활용해서 보여주는 거에요.




시스템폰트들이 있는 곳입니다.



리스트와 item을 연결해주는 Adapter를 직접만들수도 있어요
근데 왜 v.findViewById()를 할까요? 그건 리스트 안에선 아이디가 동일하지만 아이템 안에선 아이디가 유일하기 때문이에요.
그래서 아이템에 대한걸 결정해 줄때는 매번 아이템의 View v 를 이용해야 하죠.
 adapter에는 CursorAdapter라는 애도 있는데요 얘는 content provider에서 받을 수 있는 데이터를 선택가능한 뷰에 보여주기 위해서
쓰여요. 
 Adapter가 왜 필요하냐면요
 ListVeiw가 특정한 모양을 갖고 있는건 아니에요. 물론 Layout보다 훨씬 복잡한 일을 하긴 하지만 일단은 item을 배치시켜주는 역할
만 하죠. 바로 Adapter가 item을 만들어서 ListView에 공급을 해줘요. 화면에 표시될 수 있도록 Adapter가 바꿔서 전달을 하죠.
 그래서 Adapter의 Layout은 하나하나의 item에 들어가는 레이아웃이라고 볼 수 있어요.
 복잡한 형태의 List를 만들때는 ArrayAdapter를 상속받아서 필요한 부분만 구현하면 되죠.
 Adapter에서 제일 중요한 함수는 getView인데요 ListView가 하나하나의 아이템을 그릴 때마다 Adapter에게 어떻게 그리는지 
물어보는데 Adapter는 이 함수를 통해서 대답을 한다고 보면 되죠. 이 함수의 파라미터 안엔 포지션도 있기 때문에 어느 위치의
아이템을 그리는 지도 볼수 있어요.파라미터 중 convertView도 있는데 이건 재활용할수 있는 View를 나타내죠.
 ListView에 있는걸 선택하고 고르는 View 역시 Adapter를 통해서 연동이 되는데요 방대한 데이터로 하기에는 좀 무리가 있죠.
 Adapter의 item으로 들어가는 속성중에서 minHeight라는 게 있는데요 이건 item의 최소높이가 아무리 작아도 이정도는 되게 하라는
거에요.



 시스템과 App간에 약속된 id값도 있는데요 이렇게 미리 정의된 id를 사용해야 할 경우에는 @android:id 를 사용하면 되요.
 



포지션을 호출해 여러가지 응용을 할 수 있어요





신고

'T아카데미' 카테고리의 다른 글

메뉴  (0) 2010.07.03
사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
안드로이드 개발환경  (0) 2010.06.27
Posted by 응큼미소


티스토리 툴바