[android] GestureDetector 클래스

SMART_Phone/Android 2011. 5. 30. 17:47 Posted by Request
지스트럿츠디택터? 아따 길다 ㅡㅡㅋ


[Intro]

어플리케이션 개발을 하다보면 반드시 해야하는 것이 모션 이벤트 처리 입니다.

터치 이벤트 같은 것들은 DOWN - MOVE - UP의 단계를 거치면서

사용자가 어떤 동작을 입력 하는지 감지 할 수 있습니다.

이 입력의 어떤 조합으로 사용자가 어떤 동작을 했는지 감지 할 수 있겠죠.

하지만 직접 이런 제스쳐들을 구현하기란 쉬운 일만은 아닙니다. (무엇보다 귀찮죠~)

그래서 Android에서는 GestureDetector라는 클래스를 아얘 제공합니다.

[About GestureListener]

GestureDetector는 두 가지 Listener를 가지고 있습니다.

interface GestureDetector.OnDoubleTapListener
interface GestureDetector.OnGestureListener

http://developer.android.com/reference/android/view/GestureDetector.html

자세한 설명은 Reference를 보시면 됩니다.

OnDoubleTapListener는 이름 그대로 두번 터치 했을 때,

OnGestureListener는 일반적인 제스쳐들, 한번 터치나 스크롤 관련 Listner입니다.

그리고 저 두 가지 interface를 모두 가진 녀석이 있습니다.

class GestureDetector.SimpleOnGestureListener

보통 SimpleOnGestureListener만 extends 하면 모든 제스쳐를 다 사용 할 수 있습니다.

[Usage of GestureDetector]

사용법도 매우 간단합니다.

GestureDetector를 만들기만 하면 땡이죠.

mGestureDetector = new GestureDetector(this, new SimpleGestureListener());
mGestureDetector.onTouchEvent(event);

음... 너무 뜬금 없는 코드인가요? 일단 아주 간단하게 적어 봤습니다.

1. GestureDetector를 만들 때 GestureListener를 등록 하고

2. 감시할 MotionEvent를 onTouchEvent에 넣어 주면 GetstureListener가 호출이 되는 구조 입니다.

좀 더 자세하게 살펴 보면,

private final class SimpleGestureListener
extends GestureDetector.SimpleOnGestureListener {
// Implementation
}

private GestureDetector mGestureDetector;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGestureDetector = new GestureDetector(this, new SimpleGestureListener());
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}

위와 같습니다.

[Analyze Gestures]

사용법은 간단하지만 제스쳐는 그리 간단하지 않습니다.

그래서 각 제스쳐에 대해서 분석을 해봤습니다.

public boolean onDoubleTap(MotionEvent e)
public boolean onDoubleTapEvent(MotionEvent e)
public boolean onDown(MotionEvent e)
public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY)
public void onLongPress(MotionEvent e)
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX, float dY)
public void onShowPress(MotionEvent e)
public boolean onSingleTapConfirmed(MotionEvent e)
public boolean onSingleTapUp(MotionEvent e)

일단 제스쳐 이벤트에 대해서 간단히 살펴 봅시다.

onDoubleTap은 두 번 터치입니다.

onDoubleTap은 두 번 터치하면 이벤트가 더 이상 발생 되지 않지만,

onDoubleTapEvent는 DOWN, MOVE, UP 이벤트를 모두 포함 합니다. (나중에 살펴 보겠습니다.)

onDown은 터치하려고 손을 대기만 해도 발생되는 이벤트며,

모든 제스쳐의 시작입니다.

onFling은 onScroll에서 끝을 살짝 튕기는 동작에서 발생하는 이벤트며,

onScroll은 말 그대로 스크롤 시에 발생하는 이벤트 입니다.

onLongPress는 길게 눌렀을 때 발생 하는 이벤트며,

onShowPress는 onLongPress보다는 좀 더 짧은 시간동안 누르고 있으면 발생 하는 이벤트 입니다.

onSingleTap은 한 번 터치 했을 때 발생하는 이벤트며,

onSingleTabConfirmed는 한 번 터치 하고 다음에 다시 터치 이벤트가 들어오지 않았을 때,

한 번 터치가 확실 하다고 확인 시켜주는 이벤트 입니다.

자... 이제 시작입니다! 이건 간단히 살펴 본것 밖에 안되는...

본격적으로 실제 제스쳐에 따라서 어떤 이벤트가 호출 되는지 살펴 보겠습니다.

시간은 로그를 통해 한번만 계산된 시간이며,

대략 그 시간 범위에서 이벤트가 발생 한다고 보시면 됩니다.

1. 아주 살짝 터치

000ms onDown : ACTION_DOWN
060ms onSingleTapUp : ACTION_UP
306ms onSingleTapConfirmed : ACTION_DOWN

일단 손을 대면 무조건 onDown 이벤트 발생입니다.

살짝 터치를 하게 되면 보통 30~60ms 정도 후에 손이 떨어지게 됩니다.

손이 떨어 지면 onSingleTapUp 이벤트가 발생하며,

onDown이벤트 발생 후 약 300ms 안에 다시 onDown 이벤트가 발생 하지 않는다면

onSingleTapConfirmed 이벤트가 발생하여 확실히 한 번 터치 되었다는 이벤트를 발생 시킵니다.

2. 살짝 터치

000ms onDown : ACTION_DOWN
097ms onShowPress : ACTION_DOWN
172ms onSingleTapUp : ACTION_UP
303ms onSingleTapConfirmed : ACTION_DOWN

역시나 onDown 이벤트 부터 시작입니다.

1번 보다는 살짝 길게, 약 90~100ms 정도 터치되면 onShowPress 이벤트가 발생합니다.

172ms 이후에 손을 떼었으며,

역시나 300ms 정도 지나면 onSingleTapConfirmed 이벤트가 발생 됩니다.

3. 약간 길게 터치

000ms onDown : ACTION_DOWN
103ms onShowPress : ACTION_DOWN
460ms onSingleTapUp : ACTION_UP

2번보다 좀 더 길지만, LongPress는 아닌 상황입니다.

역시 이 때도 약 100ms 정도에 onShowPress 이벤트가 발생하긴 하지만

300ms 이후에 손을 떼었기 때문에 onSingleTapConfirmed 이벤트가 먹히는 현상이 일어납니다.

4. 아주 길게 터치

000ms onDown : ACTION_DOWN
096ms onShowPress : ACTION_DOWN
590ms onLongPress : ACTION_DOWN

LongPress가 발생 하는 상황입니다.

100ms 정도에 onShowPress 이벤트가 발생 하며,

590~600ms 정도에 onLongPress 이벤트가 발생 합니다.

이때 onSingleTapUp 이벤트는 발생 하지 않습니다.

두 번 터치 하는 경우에는 이벤트가 두 가지이기 때문에,

두 가지 조합의 경우 모두 살펴 보겠습니다.

5. 두 번 터치 (onDoubleTap)

000ms onDown : ACTION_DOWN
060ms onSingleTapUp : ACTION_UP
140ms onDoubleTap : ACTION_DOWN
140ms onDown : ACTION_DOWN (지연 될 수 있음)

먼저 onSingleTapUp 이벤트가 발생 합니다.

그리고 onSingleTapConfirmed 가 발생 하기 전에

다시 onDown 이벤트가 들어오게 되면 onDoubleTap 이벤트가 발생 합니다.

참고로 두번째 들어오는 onDown 이벤트는 onDoubleTap 이벤트보다 늦게 들어 올 수 있습니다.

(항상 같이 들어 오는게 아니라 onDoubleTap이 먼저 발생 합니다.)

6. 두 번 터치 (onDoubleTapEvent)

000ms onDown : ACTION_DOWN
041ms onSingleTapUp : ACTION_UP
130ms onDoubleTapEvent : ACTION_DOWN
130ms onDown : ACTION_DOWN (지연 될 수 있음)
190ms onDoubleTapEvent : ACTION_UP

onDoubleTap 이벤트와의 차이는 DOWN, MOVE, UP 이벤트까지 모두 캐치된다는 점이며,

마지막에 onDoubleTapEvent에 UP 액션이 들어오는 것을 확인 할 수 있습니다.

(위의 경우, 190ms 이후에 두번째 터치에서 손이 떨어졌다는 것을 확인 할 수 있습니다.)

7. 두 번 터치 (onDoubleTap + onDoubleTapEvent)

000ms onDown : ACTION_DOWN
080ms onSingleTapUp : ACTION_UP
200ms onDoubleTap : ACTION_DOWN
200ms onDoubleTapEvent : ACTION_DOWN (지연 될 수 있음)
200ms onDown : ACTION_DOWN (지연 될 수 있음)
260ms onDoubleTapEvent : ACTION_UP

같이 사용 하게 되면 onDoubleTap, onDoubleTapEvent 이벤트 둘 다 발생하며,

항상 onDoubleTap 이벤트가 먼저 발생 하게 됩니다.

(결과적으로 onDoubleTap - onDoubleTapEvent - onDown 순서로 발생 합니다.)

8. 두 번 터치, 두 번째 터치시 스크롤 (onDoubleTapEvent)

000ms onDown : ACTION_DOWN
080ms onSingleTapUp : ACTION_UP
179ms onDoubleTapEvent : ACTION_DOWN
179ms onDown : ACTION_DOWN (지연 될 수 있음)
280ms onDoubleTapEvent : ACTION_MOVE
289ms onShowPress : ACTION_DOWN

290ms onDoubleTapEvent : ACTION_MOVE
...
779ms onLongPress : ACTION_DOWN
800ms onDoubleTapEvent : ACTION_UP

평소에 절대 나올법한 제스쳐지만 onDoubleTapEvent의 특성을 살펴보기 위한 제스쳐 입니다.

두 번째 onDown 이벤트 이후에 MOVE 이벤트가 들어 오는 것을 확인 할 수 있으며,

한가지 특이한 점은 계속 스크롤 되지 않고 onLongPress 이벤트가 발생하면 끝난다는 점입니다.

손을 뗄 수 밖에 없는 상황이 오게 되죠.

위에서 보시다 시피,

조금 길게 눌러짐에 따라 onShowPressonLongPress가 도중에 발생 할 수도 있습니다.

9. 스크롤

000ms onDown : ACTION_DOWN
030ms onScroll : ACTION_DOWN, ACTION_MOVE
...

스크롤 이벤트는 간단 합니다.

최소 30ms 이후 부터는 onScroll 이벤트가 발생 할 수 있으며,

플링시키지 않고 살며시 손을 떼면 끝까지 onScroll 이벤트만 연속으로 발생 합니다.

10. 플링

000ms onDown : ACTION_DOWN
030ms onScroll : ACTION_DOWN, ACTION_MOVE
...
900ms onFling : ACTION_DOWN, ACTION_UP

마지막에 손가락을 슬며시 튕기는 플링 동작입니다.

스크롤 이벤트와 비슷하지만, 마지막에 UP 액션과 함께 onFling 이벤트가 동작합니다.

스크롤과 플링 제스쳐 모두 시간에 따라 onShowPress 이벤트가 발생 할 수 있습니다.

[스크랩 : http://blog.vizpei.kr/94697746]

안드로이드 앱 개발 정리[3]

SMART_Phone/Android 2011. 5. 30. 16:25 Posted by Request
[프로세스 라이프사이클]
: 일반적으로 Activity가 실행중일때 중요도에 따라 foreground activity, visible activity,
background activity, empty process 등 4개의 프로세스 상태로 분류
할수 있다.



1. foreground activity
- 조작중인 최상위 화면의 Activity  = forefround activity
(제일 중요한 프로세스로 메모리가 부족해도 제일 마지막에 제거된다.)


2.visible activity
-사용자 화면에는 보여지지만 foreground가 아닌 것을 visible activity라고 한다.


3.background activity
-사용자에게 보여지지 않고 멈춘 것이다.
시스템은 foreground나 visible 프로세스가 메모리를 요구하면 background activity를 안전하게 제거 할 수 있다.
만약 backgroundactivity프로세스를 제거 한후에
사용자가 그 Activity로 다시 내비게이션 한다면 해당 화면을 다시 보여주어야 하는데 이때 Activity의 OnCreate(Bundle savedInstanceState)메소드의 savedInstanceState파라미터를 사용한다.


4.empty process
-Service 또는 BroadcastReceiver 클래스와 같이 Activity도 없고 애플리케이션 컴포넌트도 없는 것을
empty process라고 한다.
이 프로세스는 메모리가 부족해지면 시스템에 의해 바로 제거 된다.
(임의의 백그라운드 연산은 Activity BroadcastReceiver 또는 Service의 콘텍스트에서 실행해야 한다.)

안드로이드 앱 개발 정리[2]

SMART_Phone/Android 2011. 5. 30. 15:40 Posted by Request
[ Intent Receiver, Service, Content Provider 이해하기 ]


1.Intent Receiver

핸드폰으로 전화가 걸려 오거나, 데이터 네트워크 접속이 활성화 되는 것처럼
외부에서 이벤트가 발생 했을 때 처리하기 위해 사용한다.


NotificationManager 를 이용하여 사용자에게 어떤 일이 발생했는지를 알려준다.

(AndroidManifest.xml 또는 Context.registerReceiver()를 이용 코드에서 등록)

2.Service는 UI와 상관없이 오랫동안 존재하면서 실행되는 코드이다.

예를 들면 미디어 플레이어의 Activity에서 Context.startSevice() 문장을 실행하면 service로 실행
안드로이드 시스템은 음악 재생 서비스를 멈출 때까지 계속 재생한다.

Context.bindService()메소드는 서비스에 연결하거나 아직 시작 하지 않은 Service를 시작할때 사용.


3.Content Provider
:자신의 데이터를 SQLite 데이터베이스에 저장하거나 데이터베이스를 사용 하지 않고 단순히 파일에 저장할수 있다.

Content Provider는 어떤 애플리케이션 데이터를 다른 애플리케이션이 공유할 필요가 있을 때 아주 유용하다.


안드로이드 앱 개발 정리[1]

SMART_Phone/Android 2011. 5. 30. 11:53 Posted by Request
[1.애플리케이션 구성 요소 ]
 안드로이드 애플리케이션은
Activity,
Intent Receiver
,
Service
,
Content Provider
네가지로 구성 요소로 이루어져 있다.
- 구성 요소들의 목록을 'AndroidManifest.xml' 파일에 기록해야 한다.
(어떤 구성 요소들을 선언했는지, 그들의 기능과 요구 사항은 무엇인지를 기록 하는 파일이다.)

=================================================================================

[1) Activity]
- 애플리케이션의 하나의 스크린 또는 화면을 일컫는 말.

특징 : 1)윈도우처럼 여러개의 창처럼 사용 할수 있다.
         2)Activity는 안드로이드에서 제공하는 Activity 클래스로부터 상속받아 구현해야 한다.
         3)사용자에게 Veiw이벤트(event)를  처리 할수 있는 인터페이스를 제공한다.
         4)두개의 Activity 실행 되면 이전 화면이 멈추면서 히스토리 스택(history stack)에 저장되어 이전 화면으로 돌아 갈수 있다.
         5)사용자와 상호작용을 하며, setContentView()라는 메소드를 통해 UI를 화면에 표시.

※Activity는 두개의 메소드를 구현해야 한다.
1)onCreate(Bundle)
-Activity 초기화.
-findViewById(int) : 파라미터는 UI를 정의한 레이아웃 리소스
-setContentView(int) : 메소드의 파라미터로 전달되어 화면에 표시

2)onPause()
-사용자가 Activity를 떠날 때 다루어야 하는 메소드(저장과정이 진행됨).


[Activity 생명주기]
Oncreate()
:Activity가 생성 될때 처음으로 호출되는 메소드(리소스 초기화).


OnStart()
:Activity가 사용자에게 보여줄 준비가 되었을 때 호출된다.


OnResume()
:Activity 스택의 맨 위에 있어서 Activity가 사용자에게 보여지고 사용자의 입력을 처리 할 수 있을 때 호출된다.


OnPause()
:포커스를 잃고 이전의 Activity가 Resume되기 전에 호출된다.
 데이터의 저장, 애니메이션의 중지, CPU를 소비하는 작업 중단과 같은 일들을 수행한다.


Onstop()
:더이상 Activity가 스택의 최상위에 있지 않으므로 사용자에게 보여지지 않는다.


OnDestroy()
:OnDstroy()메소드가 호출되면 시스템에 Activity가 존재하지 않는다.


흐름 예.
 Activity Start -> OnCreate() -> OnStart() -> OnResume() -> Activity Running -> OnPause() -> OnStop() -> OnDestroy() -> Activity is Shut down

 OnPause() -> OnResume()
 OnPause() -> process is Killed -> Oncreate()

 OnStop() -> OnRestart() -> OnStart()
 OnStop() -> process is Killed -> OnCreate()

====================================================================================

[2) Intent]
-Activity 간의 데이터 전송을 위한 방법으로 화면과 화면 사이를 이동할때 사용 하는 클래스이다.

예)
:A Activty 에서 B Activity로 화면이 전환 될때 Intent 클래스를 사용 법

Intent i = new Intent(this, NoteEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);

호출하는 쪽이 this,
호출당하는 쪽이 NoteEdit.calss
startActivityForResult()메소드를 통해 이루어진다.
(=startActivity() 사용 해도 용이)

호출하는 쪽 데이터를 Intent에 저장해서 보낼수 있고, 호출 당하는 쪽에서는 전달받은 Intent로부터 데이터를 추출할수 있다.


getBaseContext() 는 Activity에 속한 메소드

getApplicationContext()는 service context 이다.

 둘은 엄연히 다른 클래스로
getBaseContext()는 생성자나 Context에서 기본설정된 context이고 
getApplicationContext() 어플리케이션의 종료 이후에서도 활동할수있는 글로벌한 Application의 Context입니다.
대부분 예외가 없다면
응용프로그램의 경우 앱 종료후 메모리 유지를 피하기 위해서 getBaseContext를 사용합니다.

[퍼옴]http://cafe.naver.com/aphone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=17921&

-안드로이드는 샌드박스로 격리된 프로세스간에 통신 기능을 제공한다.

BroadCast Intent,
Service,
Content Provider,
AIDL

================================================================
2.1안드로이드 권한(Permission)
-통신 기능의 내용을 제어하기 위해서 시작과 끝점에서
Permission을 점검하는 기능이 부여 되어 있다.

Permission이 점검 당하는 시점

- 시스템 내부로의 호출 시점

- 액티비티 시작 시점

- 브로드캐스트 보내는 시점

- 켄텐츠프로바이더 접근 시점

- 서비스 바인딩 시점 또는 시작 시점

2.2 권한의 선언, 적용
다른 패키지들이 내 패키지내의 콤포넌트를 접근 제어하고자 할때 권한을 선언해서 사용 할수 있다.

permission 태그를 이용하여 선언
05__permission.PNG


<permission

android:name=”com.paad.DETONATE_DEVICE”

android:protectionLevel=”dangerous”

android:label=”Self Destruct”

android:description=”@string/detonate_description”>

   </permission>



protectionLevel속성: 

 이 레벨을 설정에 따라서 사용자가 퍼미션을 요구하는 애플리케이션 알수 있거나,

 해당 퍼미션이 누가 사용하는지 알수 있게 해 준다.

 허가할 권한의 접근 수준: normal, dangerous, signature, signatureOrSystme


permissionGroup속성:

 선택 사항으로 단지 시스템이 사용자에게 퍼미션 표시를 돕기 위해서 사용된다.

 표준 시스템 그룹에서 정의한 사항을 표기하는 것이 좋다. 

 직접 정의도 가능하다. 그렇지만 사용자에게 퍼미션UI를 단순화 하기 위해서 표준것을 사용하는 것이 

좋다.


Lavel속성, Description속성:

 퍼미션 정의에 필수 사항이다.

 Lavel: 퍼미션 리스트에 나타나고, 퍼미션이 보호하는 기능의 핵심부분을 몇개의 단어로 기술할 것

 Desc..: 퍼미션 상세보기에 나타나고, 두문장으로 기술하는데 

           첫번째문장은 퍼미션의 설명, 

           두번째는 퍼

미션 부여시 발생될 수 있는 나쁜 것이 무엇인지를 사용자에게 경고해 주는 내용을 기술한다.

adb명령을 통해서 시스템의 퍼미션 정보를 볼 수 있다.

adb shell pm list permissions

 이 명령을 통해서 시스템에 현재 정의된 퍼미션들을 볼 수 있다.


adb shell pm list permissions -s

 -s 옵션은 사용자가 보는 방식과 같은 방식으로 볼 수 있다.

참고사이트:
http://www.androidpub.com/96185
안드로이드 시작은 AndroidManifest.xml로 부터 시작한다.
일단, app 컴포넌트(activity, service, intents, content provider, broadcast receivers, notification, resource manager)의 구조 및 메타데이터를 정의를 알아 보자.
또한 Intent filter와 permissions을 사용해 다른 컴포넌트와 application과 어떻게 상호 작용 하는지 알아보겠다.

1.application package와 version
 1) <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.microjobsinc.mhandroid"
       android:versionCode="1"
       android:versionName="1.0">

xmlns : AndroidManifest.xml을 구성하는 xml의 tag element정의
-첫 Linearlayout 꼭 정의 되는데.. 두번째에도 쓰이는 경우는 무엇일까?
 예)
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"

검색결과: 특별한 이유에 대해 검색은 못했으나, 이클립스에서 그래픽콜 레이아웃에서 생성시 자동으로 정의 되는것으로 짐작됨.

*package="application" 이 참조하는 기본 source package 시작점
*versionCode : 마켓/인스톨러/런처 등에서 app이 최신인지를 판단해서, upgrade 하는 기준
*revision code : 정수 1로 시작.
*versionName: app의 통상적인 version 이름, m.n.o형식이 일반적(major, minor, point)

<uses-permission ...>
app이 동작하는 device 의 components 사용을 허가함.
1. <!--location information from GPS -->
       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
           
           2. <!-- Dialer로 전화 걸기 -->
        <uses-permission android:name="android.permission.CALL_PHONE" />

           3.<!--TEST할 수 있는 GPS 좌표 가능 ddms -->
            <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

       

안드로이드 Context 이해

SMART_Phone/Android 2011. 2. 1. 11:58 Posted by Request

Context는 크게 두가지 역할을 수행하는 Abstract 클래스 이다.

1)어플리케이션에 관하여 시스템이 관리하고 있는 정보에 접근하기
2)안드로이드 시스템 서비스에서 제공하는 API를 호출 할수 있는 기능

Context 인터페이스에서 제공하는 API 중, 대표적인 것은?
getPackgeName(), getResource() - 첫번째 역할을 수행하는 메소드
- 'get' 이라는 접두어로 시작하는 메서드
startActivity(), bindService()와 같은 메서드들은 두번째 수행하는 메소드


왜 Context 클래스가 필요할까?
 -안드로이드에서는 Context라는 인스턴스화된 매개체를 통해야만 어플리케이션 연관된 시스템 기능 수행, 시스템 함수 호출이 가능함.

안드로이드 시스템에서 어플리케이션 정보를 관리하고 있는 것은 시스템이 아닌,
ActivityMamagerService라는 일종의 또 다른 어플리케이션임.
당연히 정보를 얻고자 하는 어플리케이션이 어떤 어플리케이션인지에 관한 키 값도 필요해집니다.

즉,
자신이 어떤 어플리케이션을 나타내고 있는지 알려주는 ID 역할
ActivityManagerService에 접근 할 수 있도록 하는 통로 역할

마무리
결 론! 결국, 안드로이드 Context 는 여러가지 이유로 기존 플랫폼과는 다른 방식으로 어플리케이션을 관리하고 있고, 때문에 기존 플랫폼들에서는 단순하게 시스템 API 를 통해 할 수 있는 일들을, Context 인스턴스라는 조금은 귀찮지만 강력한 녀석을 통해 대행 처리하고 있다고 할 수 있겠습니다.

[내용 정리]
참고사이트 :
http://androidside.com/bbs/board.php?bo_table=B46&wr_id=11977




AlertDialog 예제

SMART_Phone/Android 2011. 1. 31. 22:41 Posted by Request


public AlertDialog getFinishAlertDialog() {
  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  String msg1 = getResources().getText(R.string.upload_cancel_msg1).toString();
  String msg2 = getResources().getText(R.string.upload_cancel_msg2).toString();
  builder.setTitle(getResources().getString(R.string.upload_cancel_title));
  String msg = uploadData.size() + msg1 + " " + (uploadFileCount) + msg2;
  builder.setMessage(msg);
  builder.setPositiveButton(R.string.Yes,
    new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
      isCanceled = true;


      UploadStatusActivity.this.finish();
     }
    });
  builder.setNegativeButton(R.string.No,
    new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
      isCanceled = false;
      resumeUpload();
     }
    });

리소스 레퍼런스

SMART_Phone/Android 2011. 1. 19. 23:49 Posted by Request
-어댑터, 커스텀뷰 사용시 알아야 함.

(자바프로그램에서 사용형식)
사용자 제작한 리소스 레퍼런스 : R.resource_type.resource_name
안드로이드 표준 리소스 레퍼런스 : android.r.resource_type.resource_name

(XML 프로그램에서 사용 형식)
사용자 제작한 리소스 레퍼런스 : @[package:]resource_type/resource_name
안드로이드 표준 리소스 레퍼런스 : @android:resource_type/resource_name