728x90

 

 

 

이번 글에서는 앞서 GCM을 이용하기 위한 초반 작업을 완료하고 안드로이드에서 작업 하는 과정을 정리 하겠습니다. 사용 툴은 안드로이드 스튜디오를 이용하였습니다.

 

우선 다운 받은 google-services.json 파일을 복사해서 저희 프로젝트에 가져옵니다.

 

 

저는 app 아래에 복사를 하였습니다.

 

 

 

그리고 bulid.gradle 파일을 수정합니다. 2개가 있는데 하나는 프로젝트 용 하나는 모듈 용입니다.

 

일단 프로젝트 gradle을 수정합니다.

 

 

제가 작업할때는 사진의 빨간 네모 안의 안의 버전으로 작업을 했는데 이 글을 보고 작업하실 때 시점에 맞는 적절한 버전으로 선택하여 바꿔주시면 됩니다.

 

이번엔 모듈 gradle을 수정합니다.

 

 

 

제가 작업할때는 유니티에 붙일 라이브러리로 만들기 위해서 주석이 된 부분이 있고 한대 안드로이드 기준만으로 말씀 드리면..

 

첫번째 빨간 네모 박스에 apply plugin: ‘com.android.application’을 추가하시면 됩니다.

아래의 com.android.library는 삭제하시면 됩니다. 저건 라이브러리를 만들려 할때 하는 옵션입니다..

 

두번째 빨간 네모 박스안에도 주석 되있는 것들 다 주석 해제 해주시면 됩니다. (적고 보니 아마 그냥 하시던분들은 주석이고 할 것 없이 알아서 되 있겠네요;;)

 

dependencies 안에 나머지는 신경쓰지 마시고 빨간 네모 박스 2개

compile “com.google.android.gms:play-services:8.3.0” 와, com.android.support:appcompat-v7:23.4.0”을 추가해줍니다.

 

이 두개 또한 현재 시점에 맞는 적절한 버전을 선택 해 주시면 됩니다.

 

이번엔 AndroidManifest.xml 파일을 수정하겠습니다.

 

 

빨간 네모 박스들의 내용을 AndroidManifest.xml 파일 안에 추가해줍니다.

설명을 해드리자면

com.google.android.c2dm.permission.RECEIVE 은 메세지 수신과 ID 등록을 가능하게 해주는 퍼미션입니다.

 

android.permission.WAKE_LOCK 은 메세지를 받았을때 기기를 깨울 수(폰이 꺼져있을때 화면이 켜지는..) 있도록 합니다.

 

그리고 GCM이 발송한 메시지를 처리하기 위해서 GcmReveiver 라는 리시버를 선언합니다.

그 안에는 또 필요한 퍼미션을 설정해주는데 com.google.android.c2dm.permission.SEND 퍼미션을 추가해 주어야 합니다. 그리고.. 인텐트 필터 안에 액션, 카테고리 설정해 주시구요..

 

(인텐트 필터는 짧게 말하면 인텐트 객체를 이용해 인텐트를 처리할때 객체에 들어 있는 정보를 이용하여 가장 적절한 컴포넌트를 찾는데 각 컴포넌트 안에 자신이 받을 수 있는 인텐트의 종류를 뜻하는 액션이나 카테고리와 같은 조건을 manifest파일에 저장하는데 이것이 인텐트 필터입니다. )

 

그리고 서비스를 설정해줍니다.

 

MyGcmListenerService은 서버에서 푸시를 보내면 수신하여 처리하는 부분입니다.

 

MyInstanceIDListenerService 각 디바이스마다 토큰이라고 하는 고유 값이 생성되는데 이러한 토큰의 신규 발급, 순환, 업데이트가 발생될때 처리하는 부분입니다.

 

RegistrationIntentService 토큰을 생성하는 부분입니다.

 

그 외의 푸시 진동이라던지 다른 퍼미션은 안드로이드 퍼미션 검색하셔서 추가하실거 더 추가 하시고 하면 됩니다.

 

이제 설정 부분은 끝이 났습니다.

 

이제 코드를 작성해 보겠습니다.

 

총 4개의 클래스 파일이 있습니다. MainActivity, MyGcmListenerService, MyInstanceIDListenerService, RegistrationIntentService

 

MyGcmListenerService 부터 보겠습니다.

 

 

onMessageReceived 함수에서 json형태로 푸시 메시지 수신을 받게 됩니다.

 

매개변수 from은 해당 푸시 메시지의 종류 구별이라고 하면 될것 같습니다. 이 메시지가 특정인에게 보내는거냐, 모두에게 보내는거냐 등등의 구별이라고 보시면 될 듯 합니다. 저같은 경우는 /topics/notice 라고하는 공지사항의 토픽을 하나 등록 했습니다. 나중에 다른 클래스에서 등록 하는 법도 보여드리겠습니다. 

 

그리고 data에는 title이라고하는 메시지의 제목과, message라고 하는 메시지 내용을 받아오게 됩니다.

 

그리고 sendNotification 함수에서 pendingIntent와, NotificationCompat을 이용하여 디바이스에 메시지 알림을 처리해줍니다.

 

NotificationCompat을 설정할때 좀 더 다양한 효과를 하시고 싶으시면 옵션을 추가해주시면 됩니다. 

 

이번엔 MyInstanceIDListenerService를 보겠습니다.

 

 

MyInstanceIDListenerService은 토큰이 갱신될 때 마다 onTokenRefresh가 호출되어 토큰의 교체를 담당하는 부분입니다.

 

보시면 인텐트를 통해 RegistrationIntentService 을 실행하고 여기서 토큰의 생성을 진행하게 됩니다.

 

이번엔 RegistrationIntentService를 보겠습니다.

 

 

여기선 토큰이라고 불리는 디바이스 마다 제공되는 고유의 주민등록번호?라고 보면 될것 같은데.. 아무튼 토큰을 생성합니다.

 

우리는 이 토큰을 이용해서 해당 디바이스에 푸시 메시지를 보낼수 있습니다.

 

우선 위에 sendid 값은 제가 임시로 적어논겁니다 . ㅋㅋ 원래는 저런 값이 아닙니다.

 

토큰을 생성하기 위해선 SENDID가 필요한대 우리는 전 과정에서 구글에 프로젝트를 생성할때 Sender ID라고 하는 값을 제공 받았습니다. 바로 이 값입니다.

 

만약 google-services.json을 잘 복사하여 프로젝트에 가져 오셧다면 R.java 파일에 defaultSenderId라고 하는 스트링 값으로 저장되어 있을겁니다. 그렇게 해서 가져오셔도 됩니다.

 

이 값을 통해 서버로 전송하여 토큰을 제공 받습니다.

 

만약 이러한 토큰을 따로 관리하는 서버가 있다면 토큰값을 받아 온 후 서버로 토큰값을 보내어 저장하면 되겠죠.

 

그리고 GcmPubSub 를 이용하여 앞서 말한 from 즉 해당 메시지의 종류 구별을 지정 할 수 있습니다.

 

마지막으로 MainActivity를 보겠습니다.

 

 

MainActivity 입니다. 맨 처음 UnityPlayerActivity는 제가 유니티와 연동하여 사용해볼려고 했던 터라 저런거고 본래 안드로이드라면.. 뭐 기본적인 액티비티 상속 받고 있을테니 신경 안쓰셔도 됩니다.

 

빨간 네모 부분을 보시면 될 것 같습니다.

 

MyInstanceIDListenerService는 이미 GCM의 토큰을 한번 발급받은 상태에서 다시 갱신이 이루어지거나 하면 RegistrationIntentService을 호출해서 토큰을 생성하는 부분이므로 최초에 한번은 GCM의 토큰을 우리가 수작업으로 한번 발급 받아야 합니다.

 

그래서 onCreate함수 안에서 앱이 처음 실행될 시에 RegistrationIntentService를 호출하여 토큰을 생성합니다.

 

그전에 checkPlayServices 함수를 호출하여 해당 디바이스가 Google Play Services 가 동작하는 환경인지를 확인하는 역할을 합니다. Google Play가 설치되어있지 않다면 여기서 오류가 날 것입니다.

 

이곳에서 최초 한번 RegistrationIntentService를 호출해 주면 MyInstanceIDListenerService 를 통해서 토큰이 관리되게 됩니다.

 

자 작업이 완료 되었고 이제는 메시지를 발송 해볼 차례 입니다.

 

저는 서버는 만들지 않았기 때문에 알아보니 또 크롬에서 제공되는 포스트맨이라고 하는 확장 프로그램을 통해서 테스트를 해볼수 있더라구요  

 

 

방법은 Headers 창에서 Content-Type에는 json 형태로 보내므로 application/json 을 입력.

Authorization은 저희가 앞서 구글에서 발급 받은 Server API Key 잇죠? 그걸 입력해주면 됩니다. key= 까지 같이 입력해 주셔야 됩니다.

 

그리고 Body 창에서 위 그림과 같이 설정해서 보내주시면 됩니다.

볼거는 "to" 부분에는 받을 수신자를 입력하는 부분입니다. 앞서 제가 등록한 /topics/notice로 보내면 모두에게 보내는 공지사항과 같은 거고

 

토큰같은 경우에는 (ex. fgCoc1EJRIc:APA91bEkhMcMxN5nQU7EQ0SoigFxIqLzePgfR_t-qampODk_rs6GOuEKZYK_4qI2gkknqH6L7gLlbNqKpy0ushXu13nVs11wV0y3xN_6TKeIQsbPEhUYemOHTmOx0)

이런식으로 엄청 길게 생성 됩니다..

 

"to"에 이 토큰값을 입력하여 보내면 토큰에 해당하는 디바이스에만 보내는거구요 ..

 

뭐 또 서버에서 그룹을 만들어서 개별 토큰을 저장하여 그 그룹에만 보내게 할수도 있을테고.. 여러 방법이 있을 겁니다.

 

아래는 제가 스마트폰 2개 이용해서 테스트 해본 사진입니다.. 공지사항으로 보냈을때랑. 개인에게만 보냈을때랑.. (화질이 좀 안좋은건 양해좀.. 전에 찍어둔 사진인대 확대하니 화질이 ;; )

  

 

마지막으로.. 계속 말하지만 저는 이걸 유니티에 연동 시킬 목적으로 해본거라 안드로이드의 목적으로만 하시는 분들이라면 코드가 햇갈릴수도 있을 것 같습니다.. 양해 부탁 드리고..

 

저처럼 연동을 하실 분들을 위해 제가 알고있는 걸 좀 더 추가로 알려드리면..

 

유니티에서 제공되는 classes.jar 파일 참조하도록 해야하구요.

 

jar 라이브러리 파일로 export 하시려면 gradle에서 apply plugin: 'com.android.application' 삭제 하시고 apply plugin: 'com.android.library'를 추가 해주셔야 합니다.

 

그리고 defaultConfig 안에 applicationId, versionCode, versionName도 삭제 해주셔야 합니다.

 

그리고 AndroidManifest 파일에서 android:theme 삭제 해주셔야 합니다.

아 그리고 이건 기억이 좀 가물가물 하긴 한데.. android:label="@string/app_name" 라벨 값도 아마.. 이렇게 바꿔주셔야 됫 던걸로..

 

음.. 불안하시면 그냥 웹 검색에 유니티 안드로이드 AndroidManifest 이런식으로 비슷하게 검색하면 정보가 뜰껍니다...

 

그리고 마지막으로 유니티의 Assets/plugins/Android 경로에 추출한 라이브러리 jar 파일과, AndroidManifest 파일, 그리고 추출한 라이브러리 jar이 또 참조해야하는 라이브러리 종류가 있는데 그것들도 같이 넣어주셔야 합니다.. ( 하.. 정리하면서도 이건 맞긴한데.. 더 좋은 방법이 잇을거 같기도 하고 .. )

 

제가 한 바로는 android-support-v4.jar과 play-services-basement-8.3.0.aar, play-services-gcm-8.3.0.aar 라이브러리를 같이 넣어 줬습니다. 물론 뒤에 숫자는 제가 이용한 서비스의 버전에 해당하는 거구요.. (안드로이드 스튜디오 로그켓 보면서 하나하나 에러 부분 찾으면서 찾았습니다.)

 

위에 라이브러리가 없으시다면 혹 sdk manager를 통해 다운로드 받은적이 있다면 Sdk\extras\google\m2repository\com\google\android\gms 요 경로 근처에 가시면 아마 있을겁니다.

 

아니면 .. 검색하셔서 올라와져있는 라이브러리 다운 받으시길..

 

ps.. 뒤늦게 생각해보니 좀 더 다듬을려면. oncreate 에서 RegistrationIntentService를 실행하는 인텐트를 바로 할게 아니라. 그전에 이미 발급되어 있는 토큰이 있는지. 혹은. 현재 앱의 버전이 최신 버전이 아닌지.. 버전같은 경우엔 다음 버전에서 해당 토큰이 계속 사용 된다는 보장이 없으니까..

이런 조건 들을 검사해서 토큰이 있으면 RegistrationIntentService를 실행 안하게 하고 없으면 하게 하고 이런식으로 해야 할듯?

 

지금 짠 기본 코드는 무조건 앱 실행시 RegistrationIntentService를 인텐트로 호출하니까 말이다..

 

728x90
Posted by 정망스
,
728x90

네 이번엔 저 혼자 공부하던중 유니티로 만든 게임에 푸시 메시지 기능을 구현해 보고 싶어서 나름대로의 정보를 모아.. GCM을 이용해서 푸시 메시지를 하는 방법을 정리 하는 글입니다..

 

우선 https://developers.google.com/mobile/add 여기로 들어가서 프로젝트 하나를 만듭니다.

 

Pick a Platform 버튼을 누르면 ios냐, android냐 플랫폼을 선택하는 창이 뜨는데 저는 안드로이드로 할꺼니깐 안드로이드로 선택을 합니다.

 

 

여기서는 api를 사용하기 위한 해당 프로젝트의 이름과 패키지 이름을 입력합니다.

프로젝트 이름은 하시고자 하는 이름 아무거나 정하시면 됩니다.

 

패키지 이름은 나중에 안드로이드 프로젝트를 만들어서 작업을 하므로 프로젝트의 패키지명과 동일하게 해주시는게 편합니다. (안그러면 패키지 명이 안맞아서 온갖 빨간줄이 뜬다는..)

 

 

여기서는 사용할 서비스를 선택합니다. 우리는 클라우드 메시징을 사용하기 때문에 선택을 해줍니다.

그러면 Server Api Key와, Sender ID가 저희에게 제공됩니다.

 

 

마지막 단계로 오면 최종적으로 Server Api Key와, Sender ID 그리고 위에는 google-services.json 파일을 다운로드 할 수 있습니다.

 

Server Api Key와, Sender ID는 생성되는 프로젝트마다 값은 다르지만 해당 프로젝트에서는 고유 값이므로 잊어버리지 않도록 잘 기억하시고 외부에 노출이 되는 것도 주의 하셔야 합니다.

 

그리고 영어를 보시면 (짧은 영어..) google-services.json 파일을 app/ 또는 mobile/ 디렉토리 이하로 우리의 프로젝트에 복사해서 사용하라고 합니다.

 

google-service.json 파일 안의 내용을 보시면 project_number, current_key등의 정보가 json 형태로 저장 되어 있습니다.

 

이 값들을 이용해서 안드로이드 작업을 하게 됩니다.

 

다음 글에서 안드로이드 작업 하는 과정을 정리하겠습니다.

 

 

728x90
Posted by 정망스
,
728x90

처음 프로그래밍을 할때부터 이클립스로 보통 export 하면

생기는 라이브러리가 .jar 파일을 많이 접했는데 이게 예전부터 보아왔고 사용했고, 그래서 지금도 엄청 익숙한데

 

저번 메시지 푸쉬 기능을 한번 해보면서

 

좀 내 기준에선 새로운걸 발견한 듯 하여 까먹지 않으려 일단 적어 본다.

 

결론부터 적자면 aar 이라는 나에게 있어서는 새롭게 보는 라이브러리 형태 파일인대.

 

기존에 jar 파일 형식은 유니티에서 약간 사용하기가 번거로운 부분이 많은가 보다 ..

 

보통 안드로이드에 필요한 리소스들, xml등은 res 파일에 추가 되는데 유니티에서 안드로이드와

같이 작업하긴 위해선 이 jar 파일과 + res 파일을 같이 옴겨서 사용해야 햇나보다.

 

리소스를 사용하지 않으면 문제가 없을테지만 말이다.

 

버전업 되어 나온지 유니티 5 이상부턴 aar 이라는 안드로이드 프로젝트 라이브러리 또한

사용할수 있게 지원한다는 것 같다.

 

aar 파일은 이미지, xml 등을 모두 같이 한번에 모듈화 할수 있는 듯 하다.

 

나도 최근에 google play services를 사용해보려고 라이브러리를 찾던중 아무리 찾아도 안보이길래

 

검색을 통해서 알아보니 sdk 매니저를 통해 받은 경로를 뒤져보니 각각에 필요한 기능들 별로 aar 파일이 제공되어 있었다.

 

아무래도 안드로이드를 기반으로 만드는거면 aar을 더 권장하는 목적으로 그러는거 같기도 하고.. (이건 그냥 내 생각..)

 

아무튼 새로운걸 알아 냈다.~

728x90
Posted by 정망스
,
728x90

안드로이드 개발을 하다모면 액티비티간 데이터를 주고받아야 하는 경우가 있습니다.
이런 경우 startActivityForResult() 와 onActivityResult()를 이용해 처리할 수 있습니다.

순서는 아래와  같습니다.
1. 액티비티 호출시 리퀘스트 코드를 추가한다.
2. 호출된 액티비티는  액션을 한 후 결과를 세팅하고 종료한다.
3. 기존 액티비티는 결과를 받아 처리한다.


 1. 액티비티 호출시 리퀘스트 코드를 추가한다
 
기본적으로는 액티비티를 호출할 때, startActivity() 메소드를 사용하지만,
이 경우에는 startActivityForResult() 메소드를 사용해야 합니다.

액티비티 A가 있다고 해봅니다.
액티비티 A는 intent에 데이터를 넣고, 액티비티 B를 호출할 것입니다.
이때, 액티비티 A는 자신이  호출한 액티비티 B에서 처리된 결과를 데이터로 받고 싶어 합니다.


처음에는 아래와 같이 Activity A 만 존재하고 있습니다.





이제 이 Activity A는 B를 호출합니다. 호출은 아래와 같이 이루어 집니다.
intent에 호출할 Activity B에 대한 정보와,  여러 데이터들을 담습니다.
 

 

 





Activity B가 호출 되면 아래와 같이 될것입니다.


 

1
startActivityForResult(intent, requestCode);



 

 

 2. 호출된 액티비티는 액션을 한 후 결과를 세팅하고 종료한다
 
호출된 Activity B는 자신을 호출한 Activity A로 부터 받은 데이터를 가지고 무엇인가 자신의 일을 수행할 것입니다.
그리고 모든 수행을 마쳤다면, 아래와 같이 합니다.

결과로 돌려줄 데이터가 있다면, setResult(RESULT_OK, intent) 를 실행해 결과를 함께 넘겨주고,
결과는 주지 않고, 뭔가 수행했다는 신호정도만을 돌려줄땐, setResult(RESULT_OK) 를 실행합니다.

- 여기서는  RESULT_OK 를 넣었지만, 실제로 RESULT_CANCELED 와  RESULT_FIRST_USER 라는 플래그도 있습니다.
- 중요한건 프로그래머가 식별할 수 있는 플래그를 사용하면 되는 것입니다.

그리고 모든 처리가 끝났다면 Activity B는 자신을 finish() 하면 됩니다.
 

 

 



 

1
2
3
4
Intent intent = new Intent();
intent.putExtra("resultSetting", "결과를 처리하였습니다.");
this.setResult(RESULT_OK, intent);
finish();



 

 3. 기존 액티비티는 결과를 받아 처리한다
 
Activity B는 자신을 종료시키면서 Activity A를 다시 화면위로 올려놓습니다.
그럼 Activity A에서는 자동으로 onActivityResult() 메소드가 호출됩니다. 

프로그래머는 Activity A에서 onActivityResult() 메소드를 override해서 자신이 되돌려 받은 결과로 처리하고 싶은 것을 구현하면 됩니다.



 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* (non-Javadoc)
 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
     
    // 수행을 제대로 한 경우
    if(resultCode == RESULT_OK && data != null)
    {
        String result = data.getStringExtra("resultSetting");          
    }
    // 수행을 제대로 하지 못한 경우
    else if(resultCode == RESULT_CANCELED)
    {
                     
    }
}

728x90
Posted by 정망스
,
728x90

새로운 Activity를 띄우지 않고 Windows의 팝업 창처럼 그냥 창을 띄워 상태 알람/진행을 표시하는 녀석이다.
아래 Sample은 각각 종류별로 정리했다. 종류는 아래와 같다.


  • Basic Alert - 아주 기본적인 Alert Dialog
  • Button add - Dialog 창에 Button이 추가
  • List type - 여러가지 항목을 선택
  • CheckBox type - CheckBox가 포함
  • RadioButton type - RadioButton이 포함(미리 체크 항목을 선택 할 수 있음)
  • ProgressDialog type - 동그란 에니메이션이 동작함
  • ProgressBar type - 막대 형태로 진행 상태를 표시함
  • Custom Dialog - 임의 디자인을 적용

 

1. Basic Alert

 

  

AlertDialog.Builder ab = null;
ab = new AlertDialog.Builder( AlertDialogTest.this );
ab.setMessage( Html.fromHtml("<b><font color=#ff00ff> HTML View</font></b><br>Android.com"));
ab.setPositiveButton(android.R.string.ok, null);
ab.setTitle( "Basic Alert Dialog" );
ab.show();

 

2. Button add

 

 

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(), "ID value is " + Integer.toString(id), Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(), "ID value is " + Integer.toString(id), Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});

AlertDialog alert = builder.create();
alert.show();

 

3. List type

 

 

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
alert.show();

 

4. RadioButtons type

 

 

final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
alert.show();

 

5. Checkboxes type

 

 

final CharSequence[] items = {"Red", "Green", "Blue"};
final boolean[] itemsChecked = {false, true, false };

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setMultiChoiceItems( items, itemsChecked, new DialogInterface.OnMultiChoiceClickListener() {

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText( getApplicationContext(),
items[which] + " Checked-" + Boolean.toString(isChecked),
Toast.LENGTH_SHORT).show();
}
});

AlertDialog alert = builder.create();
alert.show();

 

6. ProgressDialog type

 

 

private class ProgressDialogStop extends Thread
{
private final int mWaitTime = 3000;
private ProgressDialog dialog = null;

public ProgressDialogStop(ProgressDialog dialog) {
// TODO Auto-generated constructor stub
this.dialog = dialog;
}

@Override
public void run() {

int iWait = 0;
try
{
while( iWait < mWaitTime )
{
this.sleep(100);
iWait += 100;
}
}catch(Exception e)
{
//
}

this.dialog.dismiss();
super.run();
}
}

ProgressDialog dialog = ProgressDialog.show(AlertDialogTest.this, "",
"Loading. Please wait...", true);

Thread ProgressDialogStopThread = new ProgressDialogStop( dialog );
ProgressDialogStopThread.start();



7. ProgressBar type

 

 

private class ProgressBarStop extends Thread
{
private final int mWaitTime = 100;
private ProgressDialog progressDialog = null;

public ProgressBarStop(ProgressDialog progressDialog) {
// TODO Auto-generated constructor stub
this.progressDialog = progressDialog;
}

@Override
public void run() {

super.run();

// this.progressDialog.show(); // << 여기서 호출하면 Error 발생한다.

int iWait = 0;
try
{
while( iWait < mWaitTime )
{
this.sleep(100);
iWait++;
Log.i(LOGTAG, Integer.toString(iWait));
progressDialog.setProgress( iWait );
}
}catch(Exception e)
{
Log.i(LOGTAG, e.getMessage());
}

this.progressDialog.dismiss();
}
}

ProgressDialog progressDialog = null;
progressDialog = new ProgressDialog( AlertDialogTest.this );
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setMax(100);
progressDialog.setCancelable(true);

progressDialog.setButton("Btn1", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText( getApplicationContext(),
"Btn Click - " + Integer.toString(which),
Toast.LENGTH_SHORT).show();
}
});

progressDialog.setButton2("Btn2", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText( getApplicationContext(),
"Btn 2 Click - " + Integer.toString(which),
Toast.LENGTH_SHORT).show();
}
});

progressDialog.show();

Thread PrgrsBarStop = new ProgressBarStop( progressDialog );
PrgrsBarStop.start();



8. CustomDialog type

 

 

별도 Dialog 타입 Layout을 설정해야 한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout01"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center"
android:layout_width="200dip">

<TextView
android:id="@+id/TextView01"
android:layout_height="wrap_content"
android:textColor="#fff"
android:textStyle="bold"
android:layout_width="wrap_content"
android:text=" AndroidPeople.com"/>

<TextView
android:id="@+id/TextView02"
android:layout_height="wrap_content"
android:textColor="#fff"
android:layout_width="wrap_content"
android:layout_margin="7dip"
android:text="Custom Dialog Example By AndroidPeople.com"
android:gravity="center"/>

<Button
android:id="@+id/OkButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
/>
</LinearLayout>

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
//http://about-android.blogspot.com/2010/02/create-custom-dialog.html


public class MyCustomDialog extends Dialog {

public MyCustomDialog(Context context) {
super(context);
this.setContentView(R.layout.custom_dialog);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

Button btn = (Button)findViewById(R.id.OkButton);
btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
dismiss();
}
});
}
}

Dialog dialog = new MyCustomDialog(this);

dialog.show();


 

9. CustomDialog type 2

위 8번 내용을 그대로 사용.

 



AlertDialog.Builder md = new AlertDialog.Builder(this);
LayoutInflater contents = LayoutInflater.from(this);
View customView = contents.inflate(R.layout.custom_dialog, null);

Button btn = (Button)customView.findViewById(R.id.OkButton);
btn.setVisibility(View.INVISIBLE);

md.setPositiveButton("Positive", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
}
});

md.setNegativeButton("Negative", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
}
});

md.setNeutralButton("Neutral", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
}
});

md.setView( customView );
md.show();



기본 참고 베이스에 적절히 응용하거나, 추가해서 쓰신다면 더 예쁘고 좋은 다이얼로그 만드실수 있을 겁니다.

 

 

 

 

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침