● Composite 중에서 GridView를 살펴보겠습니다. 이것 역시 다른 객체와 함께 사용해서 화면을 구성하게 되는데요. 지난 포스팅에서 작성한 리스트뷰가 행으로 아이템을 출력했다면 이것은 가로, 세로 2차원으로 아이템을 배치하고 스크롤하면서 아이템을 탐색할 수 있습니다. 이것 또한 "ListAdapter"를 이용하여 매핑하는 방식으로 구현을 하는데요.
예제를 하나 만들면서 자세히 보겠습니다.
● 간단한 프로젝트를 하나 만들건데요. 위 그림처럼 단말기에 있는 앱의 아이콘과 이름을 아이템으로 그리드뷰로 출력하고, 아이콘을 클릭하면 앱에 대한 설명이 Toast를 통해 출력되고 어플이 실행되며, "뒤로" 버튼을 누르면 다시 돌아오는 기능을 구현하겠습니다. 즉 내가 만든 어플(GrideView)에서 "인텐트"를 이용해서 다른 어플을 실행할 수 있는점을 살펴보겠습니다.
● 이 프로젝트는 세개의 파일이 필요하겠네요. activity_mainj.xml 파일에는 그리드뷰 를 배치하고, item.xml파일을 하나 만들어서 출력할 아이템에 대한 레이아웃을 정의하고, MainActivity.java에서 단말기의 어플 목록을 가져와서 그리드뷰에 출력하는 데이터셋으로 이용하고, 이것들을 매핑하는 어댑터 클래스를 생성하여 적용하게 됩니다.
● 먼저 activity_main.xml파일에" GridView"를 배치하겠습니다.
● xml 소스코드를 살펴보겠습니다.
android:numColumns를 "auto_fit"으로 설정하여 아이템의 크기에 따라 자동으로 '열'의 수가 조정되게 하고 있구요. android:stretchMode를 "columnWidth"로 설정하여 아이템들의 '열' 폭을 자동으로 조절되게 하고 있습니다.
● 다음으로 그리드뷰에 매핑할 아이템의 레이아웃을 정의할 item.xml파일을 작성하겠습니다. 여기에는 어플의아이콘을 출력할 ImageView와 이름을 출력할 TextView가 배치가 됩니다.
이미지뷰의 크기를 큰 아이콘의 크기인 "72px"로 정의하고 있으며, 이름을 출력할 TextView가 중앙에 배치되도록 layout_gravity를 "center"로 설정하고, 텍스트뷰안에 있는 글자들이 중앙에 배치되도록 gravity를 "center"로 설정하고 있습니다. lines="1"은 이름이 한줄로만 표시되도록 하는 것이고, ellipsize를 "end"로 설정하는 것은 이름이 길때 "..."으로 줄임표시 하기 위한 것입니다.
● 이제 단말기에 설치된 어플 목록을 가져와서 실행하고, 그리드뷰에 목록을 출력하는 내용을 MainActivity.java파일에 작성하겠습니다.
이 클래스에는 또 다른 클래스(gridAdapter)가 작성이 될것입니다. 하위 클래스에서도 사용할 수 있도록 액티비티, GridView, 앱 정보를 기록할 List, 앱을 제어할 PackageManager 변수들을 전역변수로 선언하고 있습니다.
● 다음으로 Intent와 어댑터 클래스를 작성합니다.
① 위 내용중 첫번째 박스의 경우 인텐트를 통해서 앱의 목록을 가져오기 위해서 "Intent.ACTION_MAIN"으로 인텐트를 생성하고, 실행 정보를 얻기 위해 "Intent.CATEGORY_LAUNCHER"를 카테고리로 추가하고 있습니다. 패키지 관리자를 호출해서 앱 정보를 요청하고 이것을 "app"객체에 담고 있으며, 그리드뷰 객체를 찾아와서 아래쪽 클래스에서 정의할 목록 어댑터를 적용하고 있습니다.
② 다음으로 두번째 박스에서는 위쪽에서 적용한 gridAdapter 클래스를 BaseAdapter클래스를 상속받아서 작성합니다. 아이템 레이아웃 파일을 매핑하기 위해서 LayoutInflater객체를 선언하고 생성자를 정의하고, 출력할 목록 수 계산, 아이템을 호출하는 메서드, 아이템의 아이디를 구할 메서드를 정의하고 있습니다.
● 다음으로 그리드뷰에 앱 정보와 아이템 레이아웃을 매핑하는 메서드를 작성하겠습니다.
1. 아이템뷰의 아이템 레이아웃을 재활용 하는 방식으로 구현하고 있는데요. 이 메서드에서 아이템뷰는 "contvertView"에 해당이 되는데, 이 객체가 아직 생성이 되지 않은 경우에는 LayoutInflater를 이용하여 item.xml파일을 호출하여 아이템뷰의 객체를 생성하도록 하고 있습니다.
2 위에서 구한 앱목록(apps)에서 이 메서드에서 매핑할 한개의 어플 정보만 추출하고 ResolveInfo형의 "info"라는 객체에 기록하고 있습니다. 이 정보는 아래쪽에서 클릭이벤트에서도 사용하기 위해서 final로 선언을 하고 있습니다.
3. ImageView, TextView 객체를 찾아서 각각 아이콘과 이름을 대입하고 있습니다.
4. 이미지뷰를 클릭하면 해당 앱이 실행되도록 클릭 이벤트를 작성하고 있는데요. "Intent.ACTION_RUN"으로 인텐트를 생성하고, "ComponentName"으로 해당 어플 실행 객체를 불러와서 그 어플의 액티비티를 실행하도록 하고 있습니다. 이렇게 하면 현재 만들고 있는 앱에서 다른 앱들을 실행을 할 수 있게 됩니다. 그리고 "BACK" 버튼을 누르면 다시 GridView 어플로 돌아오게 하고 있습니다. 여기서 알 수 있는 한가지는 어떤 어플을 실행하기 위해서는 그 앱의 패키지 정보와 시작하는 액티비티 클래스의 이름을 알아야 하는데, 이것들을 ResolveInfo.activityInfo를 통해서 구할 수 있다는 점입니다.
마지막으로 새로 실행시키는 앱의 정보(패키지이름, 액티비티 클래스 이름)를 Toast를 이용해서 출력하도록 하고 있습니다.
● 이제 AVD에서 실행을 해보겠습니다.
● 지금까지 만든 GridView 앱을 실행을 해보면 위와 같이 AVD에 설치되어 있는 어플들의 목록이 나타나게 되고, 이것들을 클릭하면 "Toast"를 통해서 그 앱의 패키지 이름과 액티비티 클래스 이름이 출력이 되면서 실행을 하게 됩니다. 실행을 하다가 "뒤로" 버튼을 누르면 다시 돌아오는 것을 확인 할 수 있습니다. 이부분에서인텐트가 자신의 앱에서만 적용되는 것이 아니라 다른 앱까지도 적용이 된다는 것을 알 수 있습니다.
'Android' 카테고리의 다른 글
<안드로이드> Tablelayout 테두리 넣기 (0) | 2016.01.08 |
---|---|
<안드로이드> 아이콘 디자인 가이드라인/팁 (0) | 2016.01.08 |
안드로이드 앱 아이콘 사이즈 정리 (0) | 2016.01.06 |
무료로 제공하는 아이콘들 (0) | 2016.01.06 |
Android check permission for LocationManager (0) | 2016.01.04 |