GCM Client 만들기를 통하여 클라이언트 부분을 만들어 놓았습니다. 이번에는 PHP 서버에서 클라이언트로 푸시를 보내 동작을 확인해 보겠습니다.
이 튜토리얼에서는 PHP의 설치 과정이나 사용방법을 다루지는 않습니다.
1. PHP 코드 작성하기
위 코드를 작성하고 클라이언트에서 획득한 '등록ID'와 구글 개발자 콘솔에서 발급받은 '서버 키'를 대입시켜 줍니다. 그리고 클라이언트로 전송할 내용을 자유롭게 Json 형태로 넣어주면 코드가 완성됩니다.
테스트 가능한 본인의 서버에 파일을 올리고 해당 페이지를 실행시키면 잠시 후 클라이언트로 푸시가 전송됩니다.
만약 한 명의 사용자가 아닌 다수의 사용자에게 푸시를 전송하려면 arr['registration_ids']에 배열 형태로 등록ID를 넣어주시면 됩니다.
2015년 3월 29일 일요일
[ Android ] GCM Client 만들기
카카오톡에서 새로운 메시지가 왔을때 알림이나, 각종 게임 접속유도 알림은 푸시를 이용합니다. 이번 튜토리얼은 푸시를 받는 클라이언트에 대해 알아보겠습니다.
1. GCM을 사용하기 전에
GCM을 사용하기 위해서는 구글 개발자 콘솔에서 프로젝트를 등록해줘야 합니다.
https://console.developers.google.com/project 해당 URL로 이동해서 새로운 프로젝트를 만들어 줍니다(저는 GCM Test로 생성했습니다). 프로젝트 생성 후 왼쪽에 개요를 누르면 프로젝트 번호가 출력됩니다 푸시 클라이언트를 만들때 해당 번호가 필요합니다. 새로운 프로젝트를 생성고 좌측의 API 부분을 누르면 아래와 같은 페이지가 출력 됩니다.
우측에 Mobile APIs 카테고리의 Cloud Messaging for Android를 누르고 'API 사용 설정' 버튼을 눌러 사용이 가능하도록 변경합니다.
그리고 좌측에 '사용자 인증 정보'를 눌러 '새 키 만들기' 버튼을 클릭하고 출력되는 팝업에서 '서버 키'를 선택합니다.
GCM을 보내는 플랫폼에 따라서 키를 선택하면 되는데 해당 튜토리얼에서는 서버에서 GCM을 보낼것이므로 '서버 키'를 선택합니다.
3. 매니페스트 수정
GCM을 사용하기위해 몇가지 퍼미션과 리시버를 등록해주어야 합니다.
퍼미션을 동일하게 작성해주어도 상관이 없지만 리시버 부분의 패키지명은 본인 프로젝트에 맞게 수정해주어야 합니다.
receiver - intent-filter - category android:name="패키지명" : 프로젝트 패키지 이름
4. GCM 클라이언트 만들기
프로젝트에 Google Play Service 라이브러리를 추가합니다. (없으신 분들은 SDK를 업데이트 후 추가해주세요)
그리고 https://github.com/google/gcm GCM 오픈소스를 다운받아 클라이언트 부분의 GcmBroadcastReceiver, GcmIntentService 파일을 프로젝트에 추가합니다.
MainActivity에서 푸시ID를 얻기위해 코드를 작성합니다.
위 코드는 GCM 오픈소스 프로젝트의 DemoActivity를 수정하여 만들었습니다.
SENDER_ID에 1번 작업에서 적어놓았던 프로젝트 번호를 넣어줍니다. 앱을 실행하면 로그에 등록ID가 출력됩니다. 해당 ID는 서버쪽에서 클라이언트로 푸시를 보낼때 사용됩니다.
푸시가 도착했을때 기본적으로는 알림이 출력됩니다. 해당 액션을 변경하고 싶으신 분들은 GcmIntentService 클래스의 sendNotification() 함수 내용을 수정하시면 됩니다.
1. GCM을 사용하기 전에
GCM을 사용하기 위해서는 구글 개발자 콘솔에서 프로젝트를 등록해줘야 합니다.
https://console.developers.google.com/project 해당 URL로 이동해서 새로운 프로젝트를 만들어 줍니다(저는 GCM Test로 생성했습니다). 프로젝트 생성 후 왼쪽에 개요를 누르면 프로젝트 번호가 출력됩니다 푸시 클라이언트를 만들때 해당 번호가 필요합니다. 새로운 프로젝트를 생성고 좌측의 API 부분을 누르면 아래와 같은 페이지가 출력 됩니다.
그리고 좌측에 '사용자 인증 정보'를 눌러 '새 키 만들기' 버튼을 클릭하고 출력되는 팝업에서 '서버 키'를 선택합니다.
GCM을 보내는 플랫폼에 따라서 키를 선택하면 되는데 해당 튜토리얼에서는 서버에서 GCM을 보낼것이므로 '서버 키'를 선택합니다.
Key 생성을 완료하면 'API 키'가 생성이 되는데 해당 부분을 프로젝트 번호와 함께 적어둡니다.
2. Android 프로젝트 만들기
새로운 프로젝트를 하나 생성합니다. 저는 API 16, 4.1(젤리빈) 프로젝트로 생성했습니다.3. 매니페스트 수정
GCM을 사용하기위해 몇가지 퍼미션과 리시버를 등록해주어야 합니다.
퍼미션을 동일하게 작성해주어도 상관이 없지만 리시버 부분의 패키지명은 본인 프로젝트에 맞게 수정해주어야 합니다.
receiver - intent-filter - category android:name="패키지명" : 프로젝트 패키지 이름
4. GCM 클라이언트 만들기
프로젝트에 Google Play Service 라이브러리를 추가합니다. (없으신 분들은 SDK를 업데이트 후 추가해주세요)
그리고 https://github.com/google/gcm GCM 오픈소스를 다운받아 클라이언트 부분의 GcmBroadcastReceiver, GcmIntentService 파일을 프로젝트에 추가합니다.
MainActivity에서 푸시ID를 얻기위해 코드를 작성합니다.
위 코드는 GCM 오픈소스 프로젝트의 DemoActivity를 수정하여 만들었습니다.
SENDER_ID에 1번 작업에서 적어놓았던 프로젝트 번호를 넣어줍니다. 앱을 실행하면 로그에 등록ID가 출력됩니다. 해당 ID는 서버쪽에서 클라이언트로 푸시를 보낼때 사용됩니다.
푸시가 도착했을때 기본적으로는 알림이 출력됩니다. 해당 액션을 변경하고 싶으신 분들은 GcmIntentService 클래스의 sendNotification() 함수 내용을 수정하시면 됩니다.
2015년 3월 9일 월요일
[ Android ] Notification 사용하기
해당 튜토리얼은 젤리빈 4.1 버전 이상부터 정상 작동합니다.
사용 가능한 대부분의 기능들을 주석과 함께 작성하였습니다.
위 기능들은 다른 스타일의 알림에도 공통으로 적용이 가능합니다.
또한 setSmallIcon()을 작성하지 않으면 알림이 실행되지 않습니다.
알림이 등록될 때 이벤트를 지정해주는 setDefaults() 함수에서 진동을 사용하려면 퍼미션을 등록해야 합니다.
코드를 간략하게 하기위해서 1번에서 설명한 필수 기능인 setSmallIcon()을 제외하고 모두 제거하였습니다.
BigTextStyle은 아래와 같이 더 넓은 화면으로 출력이 가능합니다.
bigPicture() 메서드에 Bitmap 형식의 이미지를 넣어주면 아래와 같은 큰 이미지를 넣을 수 있습니다.
InBoxStyle은 addLine()을 사용하여 텍스트를 한 줄씩 추가가 가능합니다.
1. 기본 알림 출력 하기.
사용 가능한 대부분의 기능들을 주석과 함께 작성하였습니다.
위 기능들은 다른 스타일의 알림에도 공통으로 적용이 가능합니다.
또한 setSmallIcon()을 작성하지 않으면 알림이 실행되지 않습니다.
알림이 등록될 때 이벤트를 지정해주는 setDefaults() 함수에서 진동을 사용하려면 퍼미션을 등록해야 합니다.
2. BigTextStyle 알림 출력 하기.
코드를 간략하게 하기위해서 1번에서 설명한 필수 기능인 setSmallIcon()을 제외하고 모두 제거하였습니다.
BigTextStyle은 아래와 같이 더 넓은 화면으로 출력이 가능합니다.
3. BigPictureStyle 알림 출력 하기.
bigPicture() 메서드에 Bitmap 형식의 이미지를 넣어주면 아래와 같은 큰 이미지를 넣을 수 있습니다.
4. InBoxStyle 알림 출력 하기.
InBoxStyle은 addLine()을 사용하여 텍스트를 한 줄씩 추가가 가능합니다.
2015년 2월 5일 목요일
[ Android ] 최상위 뷰 만들기
어느 화면에서도 최상위를 유지하는 뷰를 만들어 보도록 하겠습니다.
먼저, 새로운 프로젝트를 생성합니다.
1. 최상위에 띄울 레이아웃 만들기
새로운 xml을 생성하고 원하는 레이아웃으로 꾸며줍니다.
저는 top_view.xml 파일을 생성하고 아래와 같이 버튼 하나를 생성하였습니다.
2. 최상위뷰를 컨트롤 할 버튼 만들기
자동으로 생성되는(activity_main.xml) xml을 수정합니다.
최상위 뷰를 실행 시킬 버튼과 해당 뷰를 제거하는 버튼을 만들었습니다.
3. 서비스 실행 및 종료 버튼 만들기
위 2번에서 생성한 xml을 MainActivity에서 실행을하고 버튼을 터치하면 동작을 하도록 만들어줍니다.
4. 서비스 클래스 만들기
앱이 종료되어도 뷰를 지속적으로 유지하기 위해 TopService.java 클래스를 생성합니다.
서비스가 호출되면 1번에서 생성한 뷰를 출력하고 서비스가 종료되면 해당 뷰를 제거하는 기능을 합니다.
5. 매니페스트 수정
최상위 뷰를 출력하기 위해서는 퍼미션을 등록해야하고 앱이 종료되어도 뷰를 유지 시키기 위해서는 리시버로 등록을 해야합니다.
SYSTEM_ALERT_WINDOW 퍼미션과 패키지명.TopService 서비스를 추가했습니다.
앱을 빌드하고 버튼을 눌러보면 다른 앱 위에서도 최상위를 유지하고있는 레이아웃을 확인할 수 있습니다.
중간중간 자세한 설명이 필요한 부분은 추후에 업데이트 하도록 하겠습니다.
2014년 7월 12일 토요일
[ Unity ] Android Admob 붙이기
Unity 프로젝트에 Admob 광고를 붙여보겠습니다.
이 글은 Google Mobile Ads Unity Plugin v2.1을 기준으로 작성되었습니다.
1. 패키지 다운로드
아래 링크를 통하여 최신 라이브러리를 다운받습니다.
다운로드
2. 패키지 Import
다운로드 받은 패키지를 클릭하여 유니티 프로젝트에 추가해 줍니다.
3. 라이브러리 추가
광고를 실행시키려면 구글 라이브러리가 필요합니다.
안드로이드가 설치 된 폴더의 sdk\extras\google\google_play_services\libproject 경로로 이동하면, google-play-services_lib 폴더가 존재하는데 이 폴더를 import된 폴더의 Plugins/Android안에 복사해 줍니다.
4. 애드몹 광고 생성
애드몹 사이트로 이동해 앱을 생성하시면 광고 단위 ID가 생성 됩니다.
해당 ID를 기록해두세요.
5. 새로운 스크립트 생성 및 AndroidManifest 수정
아래 스크립트에 4번에서 작성한 광고 ID를 입력해 줍니다.
유니티에서 GameObject를 만들어 새로 생성한 스크립트를 컴포넌트로 추가해줍니다.
AndroidManifest에서 com.example.sampleapp으로 되어있는 패키지명을 자신의 프로젝트 패키지명으로 변경 해줍니다.
6. 해당 Plugin 기준으로 안드로이드 버전 3.2 이상부터 사용이 가능합니다.
프로젝트 세팅에서 빌드 버전을 3.2 이상으로 변경해주세요.
빌드 후 실행을하면 잠시 후 배너가 출력됩니다.
이 글은 Google Mobile Ads Unity Plugin v2.1을 기준으로 작성되었습니다.
1. 패키지 다운로드
아래 링크를 통하여 최신 라이브러리를 다운받습니다.
다운로드
2. 패키지 Import
다운로드 받은 패키지를 클릭하여 유니티 프로젝트에 추가해 줍니다.
3. 라이브러리 추가
광고를 실행시키려면 구글 라이브러리가 필요합니다.
안드로이드가 설치 된 폴더의 sdk\extras\google\google_play_services\libproject 경로로 이동하면, google-play-services_lib 폴더가 존재하는데 이 폴더를 import된 폴더의 Plugins/Android안에 복사해 줍니다.
4. 애드몹 광고 생성
애드몹 사이트로 이동해 앱을 생성하시면 광고 단위 ID가 생성 됩니다.
해당 ID를 기록해두세요.
5. 새로운 스크립트 생성 및 AndroidManifest 수정
아래 스크립트에 4번에서 작성한 광고 ID를 입력해 줍니다.
유니티에서 GameObject를 만들어 새로 생성한 스크립트를 컴포넌트로 추가해줍니다.
AndroidManifest에서 com.example.sampleapp으로 되어있는 패키지명을 자신의 프로젝트 패키지명으로 변경 해줍니다.
6. 해당 Plugin 기준으로 안드로이드 버전 3.2 이상부터 사용이 가능합니다.
프로젝트 세팅에서 빌드 버전을 3.2 이상으로 변경해주세요.
빌드 후 실행을하면 잠시 후 배너가 출력됩니다.
2014년 5월 20일 화요일
[ Android ] SQLite 사용 방법
이번 튜토리얼에서는 SQLite를 사용하는 방법을 알아보도록 하겠습니다.
SQLite는 사용 가능한 자료형은 아래와 같이 5가지만 지원 합니다.
1. NULL
2. INTEGER : 1, 2, 3, 4, 6, 8 bytes의 정수 값
3. REAL : 8bytes의 부동 소수점 값
4. TEXT : UTF-8, UTF-16BE, UTF-16LE 인코딩의 문자열
5. BLOB : 입력 된 그대로 저장
그럼 이제부터 SQLite 사용 방법에 대하여 하나씩 알아보도록 하겠습니다.
1. SQLiteOpenHelper를 상속받은 기본 구조
DBManager라는 새로운 클래스를 생성하고 SQLite를 사용하기 위해서 SQLiteOpenHelper를 상속 받았습니다. 그리고 아래와 같이 필수로 작성되어야 하는 함수가 존재합니다.
DBManager() 함수는 생성자로 DB 이름과 버전을 넘겨 받습니다.
onCreate() 함수는 생성자에서 넘겨받은 이름과 버전의 데이터베이스가 존재하지 않을때 한번 호출 됩니다. 그렇기 때문에 새로운 데이터베이스를 생성할때 사용하기에 알맞습니다.
onUpgrade() 함수는 데이터베이스가 존재하지만 버전이 다르면 호출 됩니다. 데이터베이스를 변경하고 싶을때 버전을 올려주고 새로운 작업을 해주면 됩니다.
2. 데이터베이스 생성
새로운 데이터베이스를 생성하고 제대로 생성이 되었는지 확인해 보겠습니다. 단말기를 사용해서 확인을 하려면 루팅을 해야하고 에뮬레이터를 사용하면 명령프롬프트를 사용해서 확인을 할 수 있습니다. 여기서는 두 방법을 사용하지 않고 DB를 검색하여 데이터가 제대로 들어 갔는지 확인해보겠습니다.
먼저 DB가 존재하지 않을때 아래와 같은 FOOD_LIST 테이블을 생성하도록 하겠습니다.
FOOD_LIST 라는 테이블에 정수형, 기본 키 그리고 자동으로 값이 증가하는 _id 컬럼과, Text형식의 name 컬럼, 정수형 price 컬럼으로 구성 되도록 만들었습니다.
3. 삽입, 삭제, 갱신, 선택
Xml에 코드를 작성하여 버튼과 에디트 텍스트를 만들고 삽입, 삭제, 갱신, 선택을 해보도록 하겠습니다.
main.xml
기본 생성 된 main.xml에 테이블에 입력시킬 name과 price를 입력받는 EditText 두개, 쿼리 실행 후 테이블 안의 내용을 출력 할 TextView하나 그리고 삽입, 삭제, 갱신, 선택을 실행 할 Button 4개로 구성하였습니다.
MainActivity.java
main.xml에서 선언해 주었던 위젯들을 연결하고 각 버튼을 누를때 DBManager로 쿼리를 요청하도록 되어있습니다.
마지막 select 쿼리는 DBManager에 테이블의 모든 요소를 가져오도록 만들었습니다.
DBManager.java
가장 핵심적인 부분이라고 할 수 있겠습니다.
소스를 보시면 insert(), update(), delete() 함수의 내용이 똑같이 생겼는데요. 원래는 DBManager 이 소스에서 쿼리를 작성하려고 했는데 MainActivity.java에 작성을 하다보니 함수의 내용이 똑같아져 버렸습니다. 이쪽에다가 쿼리를 작성해 주는게 더 좋겠죠.
getReadableDatabase() : 읽기 가능, 사용 후 close()로 종료
getWritableDatabase() : 읽기, 쓰기 가능, 사용 후 close()로 종료
PrintData()함수를 보시면 삽입, 삭제, 갱신 쿼리를 요청 할 때는 execSQL() 함수를 사용 하지만 선택을 할 때는 rawQuery() 함수를 사용 하여야 합니다. select 쿼리는 결과값을 받아야 하기 때문에요.
Cursor로 결과값을 받아서 moveToNext() 함수로 null이 나올때 까지 하나씩 이동해가면서 결과값에 접근합니다.
값을 가져올때는 테이블을 생성할 때 속성 순서대로 0 부터 생성 된 속성까지 얻어 올 수 있습니다.
Select
- select * from 테이블명;
테이블의 모든 속성과 값을 가져온다.
- select 속성, 속성... from 테이블명;
테이블에 선택한 속성의 값만 가져온다.
Insert
- insert into 테이블명 values(속성, 속성...);
테이블에 입력한 속성값으로 추가 한다. (속성의 순서가 일치해야 함)
Delete
- delete from 테이블명 where 조건, 조건...;
테이블에 조건이 일치하는 값을 삭제한다.
Update
- update 테이블명 set 값, 값... where 조건, 조건...;
테이블에 조건에 일치하는 속성의 값을 입력한 값으로 변경한다.
쿼리문에 조건은 콤마(,) 사용 시 여러 조건을 가질 수 있습니다.
기본적인 SQLite 사용방법 튜토리얼은 여기까지 입니다.
위 소스에는 예외처리가 안되어있습니다.
SQLite는 사용 가능한 자료형은 아래와 같이 5가지만 지원 합니다.
1. NULL
2. INTEGER : 1, 2, 3, 4, 6, 8 bytes의 정수 값
3. REAL : 8bytes의 부동 소수점 값
4. TEXT : UTF-8, UTF-16BE, UTF-16LE 인코딩의 문자열
5. BLOB : 입력 된 그대로 저장
그럼 이제부터 SQLite 사용 방법에 대하여 하나씩 알아보도록 하겠습니다.
1. SQLiteOpenHelper를 상속받은 기본 구조
DBManager라는 새로운 클래스를 생성하고 SQLite를 사용하기 위해서 SQLiteOpenHelper를 상속 받았습니다. 그리고 아래와 같이 필수로 작성되어야 하는 함수가 존재합니다.
DBManager() 함수는 생성자로 DB 이름과 버전을 넘겨 받습니다.
onCreate() 함수는 생성자에서 넘겨받은 이름과 버전의 데이터베이스가 존재하지 않을때 한번 호출 됩니다. 그렇기 때문에 새로운 데이터베이스를 생성할때 사용하기에 알맞습니다.
onUpgrade() 함수는 데이터베이스가 존재하지만 버전이 다르면 호출 됩니다. 데이터베이스를 변경하고 싶을때 버전을 올려주고 새로운 작업을 해주면 됩니다.
2. 데이터베이스 생성
새로운 데이터베이스를 생성하고 제대로 생성이 되었는지 확인해 보겠습니다. 단말기를 사용해서 확인을 하려면 루팅을 해야하고 에뮬레이터를 사용하면 명령프롬프트를 사용해서 확인을 할 수 있습니다. 여기서는 두 방법을 사용하지 않고 DB를 검색하여 데이터가 제대로 들어 갔는지 확인해보겠습니다.
먼저 DB가 존재하지 않을때 아래와 같은 FOOD_LIST 테이블을 생성하도록 하겠습니다.
FOOD_LIST 라는 테이블에 정수형, 기본 키 그리고 자동으로 값이 증가하는 _id 컬럼과, Text형식의 name 컬럼, 정수형 price 컬럼으로 구성 되도록 만들었습니다.
3. 삽입, 삭제, 갱신, 선택
Xml에 코드를 작성하여 버튼과 에디트 텍스트를 만들고 삽입, 삭제, 갱신, 선택을 해보도록 하겠습니다.
main.xml
기본 생성 된 main.xml에 테이블에 입력시킬 name과 price를 입력받는 EditText 두개, 쿼리 실행 후 테이블 안의 내용을 출력 할 TextView하나 그리고 삽입, 삭제, 갱신, 선택을 실행 할 Button 4개로 구성하였습니다.
MainActivity.java
main.xml에서 선언해 주었던 위젯들을 연결하고 각 버튼을 누를때 DBManager로 쿼리를 요청하도록 되어있습니다.
마지막 select 쿼리는 DBManager에 테이블의 모든 요소를 가져오도록 만들었습니다.
DBManager.java
가장 핵심적인 부분이라고 할 수 있겠습니다.
소스를 보시면 insert(), update(), delete() 함수의 내용이 똑같이 생겼는데요. 원래는 DBManager 이 소스에서 쿼리를 작성하려고 했는데 MainActivity.java에 작성을 하다보니 함수의 내용이 똑같아져 버렸습니다. 이쪽에다가 쿼리를 작성해 주는게 더 좋겠죠.
getReadableDatabase() : 읽기 가능, 사용 후 close()로 종료
getWritableDatabase() : 읽기, 쓰기 가능, 사용 후 close()로 종료
PrintData()함수를 보시면 삽입, 삭제, 갱신 쿼리를 요청 할 때는 execSQL() 함수를 사용 하지만 선택을 할 때는 rawQuery() 함수를 사용 하여야 합니다. select 쿼리는 결과값을 받아야 하기 때문에요.
Cursor로 결과값을 받아서 moveToNext() 함수로 null이 나올때 까지 하나씩 이동해가면서 결과값에 접근합니다.
값을 가져올때는 테이블을 생성할 때 속성 순서대로 0 부터 생성 된 속성까지 얻어 올 수 있습니다.
Select
- select * from 테이블명;
테이블의 모든 속성과 값을 가져온다.
- select 속성, 속성... from 테이블명;
테이블에 선택한 속성의 값만 가져온다.
Insert
- insert into 테이블명 values(속성, 속성...);
테이블에 입력한 속성값으로 추가 한다. (속성의 순서가 일치해야 함)
Delete
- delete from 테이블명 where 조건, 조건...;
테이블에 조건이 일치하는 값을 삭제한다.
Update
- update 테이블명 set 값, 값... where 조건, 조건...;
테이블에 조건에 일치하는 속성의 값을 입력한 값으로 변경한다.
쿼리문에 조건은 콤마(,) 사용 시 여러 조건을 가질 수 있습니다.
기본적인 SQLite 사용방법 튜토리얼은 여기까지 입니다.
위 소스에는 예외처리가 안되어있습니다.
2014년 5월 11일 일요일
[ Android ] ListView 사용 방법 및 커스텀
이번 튜토리얼은 ListView의 기본적인 사용 방법과 커스텀 방법에 대해 알아보겠습니다.
1. xml 수정하기
ListView가 보여질 레이아웃의 xml에 ListView 위젯을 추가 합니다.
2. ListView 및 Adapter 설정
어댑터를 생성하고 xml에 추가한 Listview에 어댑터를 연결하여 ListView가 동작 되도록 해보겠습니다.
여기 까지는 기본적인 리스트 뷰 사용방법 입니다.
이제 커스텀 하는 방법을 알아보도록 하겠습니다.
3. ListView에 출력 될 레이아웃 만들기
원하는 모양의 아이템을 출력하기 위해서 새로운 xml파일을 생성하여 출력 될 모양을 만들어야 합니다.
여기서는 텍스트와 버튼이 출력 되도록 만들어 보겠습니다.
custom_item.xml 파일
4. 커스텀 어댑터 생성
CustomAdapter 클래스를 생성하고 BaseAdapter 클래스를 상속 받습니다.
문자열을 보관 하기 위해 ArrayList<String> 를 사용하며, String 대신에 직접 만든 클래스를 추가하면 더욱 많은 정보를 가진 커스텀 아이템을 제작 할 수 있습니다.
5. ListView 및 Adapter 설정
위 2번에서 했던 작업 입니다. 2번 소스와 비교해 보시면 어댑터 부분이 변경 된 것을 확인 하실 수 있습니다.
여기 까지 제작 하고 실행을 하면 각종 이벤트가 정상 작동 하는 것을 확인 하실 수 있습니다.
하지만, 어댑터에 아이템을 더 추가하여 스크롤이 되게 만들면 아이템 위치가 변경되 출력 되는게 보이실 겁니다.
6. Holder를 추가하여 데이터 변형 방지
새로운 클래스를 하나 생성하여 getView()에서 홀더를 사용하면 스크롤 시 데이터가 변경 되는 것과 findViewById()를 사용을 줄여 향상 된 속도를 얻을 수 있습니다.
변경 된 부분의 소스는 아래와 같습니다.
CustomHolder 라는 클래스가 하나 추가 되었으며 이 클래스는 아이템이 갖고 있는 요소를 저장 할 수 있도록 TextView와 Button을 갖고 있습니다.
그리고 getView() 함수에서는 convertView가 null 일 때 holder를 생성하여 holder에 TextView와 Button을 넣고 해당 View의 Tag로 지정을 합니다. 만약 convertView가 null이 아니라면 Tag를 가져와 저장해 놓았던 TextView와 Button을 빼내 나머지 처리를 하게 됩니다.
이상으로 ListView 사용 방법과 커스텀에 대한 튜토리얼을 마치도록 하겠습니다.
1. xml 수정하기
ListView가 보여질 레이아웃의 xml에 ListView 위젯을 추가 합니다.
2. ListView 및 Adapter 설정
어댑터를 생성하고 xml에 추가한 Listview에 어댑터를 연결하여 ListView가 동작 되도록 해보겠습니다.
여기 까지는 기본적인 리스트 뷰 사용방법 입니다.
이제 커스텀 하는 방법을 알아보도록 하겠습니다.
3. ListView에 출력 될 레이아웃 만들기
원하는 모양의 아이템을 출력하기 위해서 새로운 xml파일을 생성하여 출력 될 모양을 만들어야 합니다.
여기서는 텍스트와 버튼이 출력 되도록 만들어 보겠습니다.
custom_item.xml 파일
4. 커스텀 어댑터 생성
CustomAdapter 클래스를 생성하고 BaseAdapter 클래스를 상속 받습니다.
문자열을 보관 하기 위해 ArrayList<String> 를 사용하며, String 대신에 직접 만든 클래스를 추가하면 더욱 많은 정보를 가진 커스텀 아이템을 제작 할 수 있습니다.
5. ListView 및 Adapter 설정
위 2번에서 했던 작업 입니다. 2번 소스와 비교해 보시면 어댑터 부분이 변경 된 것을 확인 하실 수 있습니다.
여기 까지 제작 하고 실행을 하면 각종 이벤트가 정상 작동 하는 것을 확인 하실 수 있습니다.
하지만, 어댑터에 아이템을 더 추가하여 스크롤이 되게 만들면 아이템 위치가 변경되 출력 되는게 보이실 겁니다.
6. Holder를 추가하여 데이터 변형 방지
새로운 클래스를 하나 생성하여 getView()에서 홀더를 사용하면 스크롤 시 데이터가 변경 되는 것과 findViewById()를 사용을 줄여 향상 된 속도를 얻을 수 있습니다.
변경 된 부분의 소스는 아래와 같습니다.
CustomHolder 라는 클래스가 하나 추가 되었으며 이 클래스는 아이템이 갖고 있는 요소를 저장 할 수 있도록 TextView와 Button을 갖고 있습니다.
그리고 getView() 함수에서는 convertView가 null 일 때 holder를 생성하여 holder에 TextView와 Button을 넣고 해당 View의 Tag로 지정을 합니다. 만약 convertView가 null이 아니라면 Tag를 가져와 저장해 놓았던 TextView와 Button을 빼내 나머지 처리를 하게 됩니다.
이상으로 ListView 사용 방법과 커스텀에 대한 튜토리얼을 마치도록 하겠습니다.
2014년 5월 7일 수요일
[ Android ] Fixed Tabs + Swipe 앱 만들기
이번 튜토리얼에서는 Fixed Tabs Swipe 앱을 만들어 보겠습니다.
Fixed Tabs + Swipe는 좌측과 같은 레이아웃 인데요.
상단의 메뉴를 터치하거나 화면을 터치하여 옆으로 드래그 해주면
설정 되어있는 액티비티로 전환이 됩니다.
1. 프로젝트 생성하기
먼저 안드로이드 프로젝트를 새로 만들어 줍니다.
위 화면에서 Navigation Type을 Fixed Tabs + Swipe로 선택하고 Finish를 누르시면 기본적인 프로젝트가 생성됩니다.
2. SectionPagerAdapter 클래스 보기
프로젝트가 이미 완성되어서 그대로 사용하셔도 상관없습니다.
SectionPagerAdapter 클래스를 보면 getItem() 함수에서 position을 받아 더미 클래스를 생성하고 TextView에 position 번호를 입력해 주고 있습니다.
position은 0부터 getCount()에서 받아오는 이전 값까지 나타냅니다.
getPageTitle() 함수도 position을 받아와 해당 Fragment 메뉴에 라벨을 입력하게 됩니다.
3. 새로운 클래스와 레이아웃 만들기
더미 클래스와 레이아웃을 대체할 새로운 클래스와 레이아웃을 만들어 보겠습니다.
Fragment_Menu1 이라는 클래스를 생성하고 Fragment를 상속 받았습니다.
그리고 onCreateView() 함수를 오버라이드 하였습니다.
해당 Fragment에서 보여질 레이아웃 xml 파일을 만들겠습니다.
TextView를 하나 추가하고 'fragment main 1'이라는 문구를 출력하게 하였습니다.
두 파일을 만들었으니 생성한 클래스에서 레이아웃 파일을 연결해 보겠습니다.
Fragment_Menu1 클래스의 onCreateView() 함수에서 방금 생성한 fragment_main_1.xml 레이아웃을 연결하였습니다.
동일한 방법으로 클래스 이름과 레이아웃 이름, 그리고 레이아웃에서의 텍스트 내용을 숫자만 증가시켜 4개를 만들었습니다.
4. 메인 액티비티의 SectionPagerAdapter 수정
마지막으로 MainActivity에 존재하는 SectionPagerAdapter를 수정하겠습니다.
getItem()함수에는 position에 따라 3번에서 만들어준 클래스를 리턴해 주겠습니다.
getCount()는 총 4개의 메뉴를 생성 할 것이므로 기존 3의 값에서 4로 변경하였습니다.
getPageTitle()에서는 values -> styles.xml파일을 수정하여 텍스트를 하나 추가시켰습니다.
이제 빌드 후 실행을 시켜보면 완성 된 모습을 보실 수 있습니다.
다음 튜토리얼에서는 이번 튜토리얼에 이어서 ListView를 추가해 보도록 하겠습니다.
Fixed Tabs + Swipe는 좌측과 같은 레이아웃 인데요.
상단의 메뉴를 터치하거나 화면을 터치하여 옆으로 드래그 해주면
설정 되어있는 액티비티로 전환이 됩니다.
1. 프로젝트 생성하기
먼저 안드로이드 프로젝트를 새로 만들어 줍니다.
프로젝트 생성 시 주의할 부분이 있는데요. Fixed Tabs + Swipe 프로젝트를 생성하기 위해서는 Minimum Required SDK의 버전이 최소 11로 설정 되어야 합니다. 설정을 완료 하셨으면 아래 화면이 나올때 까지 Next를 눌러 줍니다.
위 화면에서 Navigation Type을 Fixed Tabs + Swipe로 선택하고 Finish를 누르시면 기본적인 프로젝트가 생성됩니다.
2. SectionPagerAdapter 클래스 보기
프로젝트가 이미 완성되어서 그대로 사용하셔도 상관없습니다.
SectionPagerAdapter 클래스를 보면 getItem() 함수에서 position을 받아 더미 클래스를 생성하고 TextView에 position 번호를 입력해 주고 있습니다.
position은 0부터 getCount()에서 받아오는 이전 값까지 나타냅니다.
getPageTitle() 함수도 position을 받아와 해당 Fragment 메뉴에 라벨을 입력하게 됩니다.
3. 새로운 클래스와 레이아웃 만들기
더미 클래스와 레이아웃을 대체할 새로운 클래스와 레이아웃을 만들어 보겠습니다.
Fragment_Menu1 이라는 클래스를 생성하고 Fragment를 상속 받았습니다.
그리고 onCreateView() 함수를 오버라이드 하였습니다.
해당 Fragment에서 보여질 레이아웃 xml 파일을 만들겠습니다.
TextView를 하나 추가하고 'fragment main 1'이라는 문구를 출력하게 하였습니다.
두 파일을 만들었으니 생성한 클래스에서 레이아웃 파일을 연결해 보겠습니다.
Fragment_Menu1 클래스의 onCreateView() 함수에서 방금 생성한 fragment_main_1.xml 레이아웃을 연결하였습니다.
동일한 방법으로 클래스 이름과 레이아웃 이름, 그리고 레이아웃에서의 텍스트 내용을 숫자만 증가시켜 4개를 만들었습니다.
4. 메인 액티비티의 SectionPagerAdapter 수정
마지막으로 MainActivity에 존재하는 SectionPagerAdapter를 수정하겠습니다.
getItem()함수에는 position에 따라 3번에서 만들어준 클래스를 리턴해 주겠습니다.
getCount()는 총 4개의 메뉴를 생성 할 것이므로 기존 3의 값에서 4로 변경하였습니다.
getPageTitle()에서는 values -> styles.xml파일을 수정하여 텍스트를 하나 추가시켰습니다.
이제 빌드 후 실행을 시켜보면 완성 된 모습을 보실 수 있습니다.
다음 튜토리얼에서는 이번 튜토리얼에 이어서 ListView를 추가해 보도록 하겠습니다.
피드 구독하기:
글 (Atom)