● 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"를 통해서 그 앱의 패키지 이름과 액티비티 클래스 이름이 출력이 되면서 실행을 하게 됩니다. 실행을 하다가 "뒤로" 버튼을 누르면 다시 돌아오는 것을 확인 할 수 있습니다. 이부분에서인텐트가 자신의 앱에서만 적용되는 것이 아니라  다른 앱까지도 적용이 된다는 것을 알 수 있습니다.

+ Recent posts