어댑터, 리스너 복습

SMART_Phone/Android 2011. 1. 19. 23:41 Posted by Request

1)어댑터(Adapter) : 데이터를 다양한 형식의 리스트 형식을 보여주기 위해서 데이터와 리스트 뷰 사이에 존재하는 객체를 말한다.
(데이터와 리스트 뷰의 연결 고리 라 생각 하면 됨)

2)리스너(Listener) :  이벤트 감지, 알맞는 동작 하도록 구현(이벤트의 반응하는 메소드를 뜻함.)
 주로 Nested class(익명 클래스, Inner class), GUI class 이벤트 처리로 구현 됨.

3)콜백함수(CallBack) : 실제 작동하는 메소드


리스너 (이벤트 응답, 호출)-> 콜백(실행)





안드로이드 포커스 조작 이해

SMART_Phone/Android 2011. 1. 19. 23:31 Posted by Request

터치모드의 Focusable

XML모드 : android:focusableInTouchMode
Java모드 : setfocusableInTouchMode(Boolean)


*개발자가 포커스 조작 종류
-뷰에 대한 포커스 이동
-새로운 뷰에 대한 포커스 여부


                   
 XML JAVA  내용 
 android:nextFocusDown  setNextFocusDownId(int)  포커스를 아래쪽으로 움직인다.
 android:nextFocusUp  setNextFocusUpId(int)  포커스를 위로 움직인다.
 android:nextFocusright  setNextFocusRightId(int)  포커스를 오른쪽으로 움직인다. 
 android:nextFocusLeft  setNextFocusLeftId(int)  포커스를 왼쪽으로 움직인다.

ex)android:nextFocusUp="@+id/bottom

뷰에 대한 포커스 확인 및 세팅
 XML  JAVA 내용 
  isFocusable()   포커스 여부 확인
  isFocusableInTouchMode()  
  requestFocus()  포커스를 요청
 android:focusable setFocusable(boolean)  포커스를 설정
 android:focusableInTouchMode setFocusableInTouchMode(boolean)  터치모드에서 포커스 설정


안드로이드 버젼 2.0부터 HOME, MENU, BACK, SEARCH 키가  가상키로 지원하는데, 일반적으로
onKeyUp에서 해당 버튼들을 실행 시키는 것이 좋다.

-다이얼로그(Dialog)나 액티비티(Activity)에서는 onBackPressed()로 구현
-뷰에서 처리할 때는 onKeyDown 내에서 새롭게 정의한 StartTracking() 로 키 이벤트를
처리하고, 추가작업은 onKeyUp로 다음과 같이 처리함.


 public boolean onKeyDown(int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
     event.startTracking();
     return true;
}
return super.onKeyDown(keyCode event);
}

public boolean onKeyUp(int keyCode, KeyEvent event){
   if(keyCode == KeyEvent.KEYCODE_BACK && event.isTracking() && !event.isCanceled()){
     //*** Do ACTION Here ***//
       retrun true;
}
return super.onKeyUp(keyCode, event);
}

================================================================
[안드로이드용 권고 소스]
public boolean onKeyDown(int keyCode, KeyEvent event){
   if(android.os.Build.VERSION.SDK_INT  < android.os.Build.VERSION_CODES.ECLAIR && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
  //Take care of calling this method on earlier versions of
  //the platform where it doesn't exist.
onBackPressed();

}
return.super.onKeyDown(keyCode, event);
}

public void onBackPressed(){
return;
}

이벤트 핸들러(Event Handler)

SMART_Phone/Android 2011. 1. 14. 11:56 Posted by Request

 이벤트 핸들러는 화면의 UI 엘리먼트(뷰나 뷰그룹)과 관계없이 주로 카메라 버튼이나 키보드 그리고
방향키를 누르는 행위와 같은 이벤트에 대해 사전 정의된 핸들러 메소드가 실행되는 방식들을 의미합니다.

 주로 액티비티나 리스트 액티비티(ListActivity) 그리고 다이얼로그와 연결하여 작업을 수행하며,
대표적인 예가 KeyEvent입니다.



※액티비티에서 사용하는  이벤트핸들러 콜백함수
                     콜백함수                         트리거
 onKeyDown()  물리적으로 디바이스 키를 누를 때 발생
 onKeyUp()  눌러졌던 디바이스 키에서 손을 뗄 때 발생
 onKeyPressLong() 디바이스 키를 오랫동안 누름 
 onTouchEvent() 스크린 터치 
 onTrackballEvent() 물리적으로 트랙볼 움직이거나 누른 경우 발생 
 onBackPressed() 백키를 누른 경우 발생 

※리스트액티비티(LisyAcctivity) 관련 핸들러 콜백함수
    콜백함수                         트리거
 onListItemClick()  리스트 아이템에 포커스시킨 이후 방향 키나 트랙볼을 작동시킴.



안드로이드에서 단위테스트를 위한 Junit 사용하기 (1) 


프로그램을 개발할 때 마다 공통적으로 반복되는 부분들이 있다. 그리고 개발 생산성과

효율을 높이기 위해 단위별로 테스트 하는 것이 요즘 추세이다. 단위별로 테스트하고

완성된후 다시 합쳐 전체적인 테스트를 진행하는 것이다.

이런 작업들을 하기위해서 Junit framework eclipse 플러그인으로 만들어 쉽게 사용할수

있도록 제공해 준다. Java Web Application 에서는 많이 사용해봐서 익숙하지만

Android 에서는 처음이라 이렇게 아티클을 작성하게 되었다.

 

안드로이드 SDK 를 보게 되면 내부에 Junit 클래스가 존재한다. 그러므로 이전에 작업했던

환경설정과 실행법이 같다. 별 어려움 없이 진행이 가능하며, 단지 특이한 점은

안드로이드 에서 제공하는 TestCase 들이 여럿있다는 것이다.  DB 테스트를 위해

DBUnit 라는 것이 있듯이 안드로이드에서도 Activity 단위별로 테스트 할수 있는

ActivityUnitTestCase, Service 를 테스트 해볼수 있는 ServiceTestCase 등이 있다.

전부 조사해보지 않아 상세하게 기술 해볼수는 없지만 우선 2편에서 ActivityUnitTestCase

사용법에 대해 대략적인 사용법을 설명하였다.

 

1. Android Junit project 생성

 

안드로이드에서 단위테스트를 시행하기 위한 Junit 설정은 프로젝트 생성부터 다르다.

기존에 있는 프로젝트를 대상으로 Junit 을 실행하는 방법과 프로젝트 자체가 Junit

시행할수 있는 프로젝트로 나누어 생성할수 있다.

Android Test Project 를 선택하면 아래의 설정화면이 나오는데 Test Target 를 설정하는

곳이 있다. 현재 만들 프로젝트를 Junit 으로 사용할것인지, 아니면 이미 만들어진

프로젝트를 상대로 구동할것인지에 대한 내용을 선택한다. 그리고 Build Target

선택할때에는 Target 이 되는 SDK와 맞아야 한다.

기존에 존재하는 프로그램을 타겟으로 프로젝트를 생성하게 된다면 AndroidManifest.xml

에 설정값이 바뀌게 된다. <instrumentation android:targetPackage =

"com.success" android:name="android.test.InstrumentationTestRunner" />

와 같이 targetPackage 값이 target 으로 정한 패키지 주소가 된다.

그리고 아래쪽에 탭중 Application 을 클릭하게 되면 사용 Uses Library

android.test.runner 를 사용하고 있는 것을 볼수 있다.

위의 두가지는 Junit을 돌리기 위한 필수 요소 이다. 이것은 일반 프로젝트에서 볼수

없는 것으로 기존 프로젝트에서 사용하고 싶다면 설정을 해줘야한다.

만든 프로젝트를 실행해보자. 프로젝트를 선택하고 오른마우스를 클릭하여

Debug/Run Configuration 선택한다. Android Junit Test 란에 보면 프로젝트가

추가 된 것을 볼수 있다. 그 프로젝트를 선택하고 오른쪽에 Debug 를 클릭해

실행하면 된다. 또 다른 방법은 Junit 클래스를 선택하고 직접 Android Junit Test

실행해도 된다.


2. 기존 프로젝트에서 Android Junit 설정하여 사용하기

 

Android Junit Project 로 생성한 프로젝트가 아닌 일반 프로젝트에서 테스트할 Junit 클래스를

만들어 실행하고 싶을때가 있을것이다. 일반 프로젝트에서 아무리 Junit 테스트 클래스를 만들어

실행해도 Instrumentation runner 가 없다고 에러가 날것이다. 제대로 실행할려면 위에서 말한

두가지 요소를 첨부해야 한다.

ApplicationManifest.xml 을 클릭한다. Application 탭을 클릭하면 아래쪽에 Application Node

란을 볼수 있다. 리스트 안에보면 Uses Library android.test.runner 을 추가한다

element  Uses Library 로 선택한다

두번째는 Instrumentation 탭을 클릭한다 . 여기서 Add 를 클릭하고 Instrumentation

선택한다. 그리고 Name 란에 android.test.InstrumentationTestRunner Target Package

테스트할 패키지를 넣는다

다시 Debug Configuration 에 들어가서 확인하면 Instrumentation runner

값이 들어간 것을 확인할수 있을 것이다

아래 Debug 를 실행하면 AVD(android virtual device) 실행창이 뜬다. 적절한 AVD

선택하고 start 를 클릭한다.

AVD 가 실행되었다면 실행된 AVD 를 타겟으로 Debug 가 실행된다. Junit 은 프로젝트

패키지에서 junit.framework.TestCase 상속받은 Junit 클래스를 찾아 실행시킨다. Junit

익스플로어에서 실행한 결과 값을 보여주는데 시간과 함수명이 나오는 것을 볼수 있다

그리고 다시 시작해서 테스트를 하고 싶으면 왼쪽 패키지를 클릭하고 오른쪽마우스로

Debug / Run 을 실행하면 된다.

테스트를 위한 Junit test case 클래스는 새로운 클래스 만들 때 Android 라이브러리에

포함된 Junit.framework.TestCase 상속받아 만들면 된다. 이것은 흔히 자바에서 사용하는

단순한 형태의 Case 를 실행하기 위한 클래스이며 UI 나 다양한 컴퍼넌트 구조에서

사용할수 있는 클래스는 따로 있는데 ActivityUnitTestCase, ApplicationTestCase,

ServiceTestCase 등이 그것이다. 실행 환경에 맞게 적절하게 사용하면 된다.

스크랩 : http://mainia.tistory.com/486

안드로이드 디버깅 세팅?!

SMART_Phone/Android 2011. 1. 10. 22:21 Posted by Request

디버깅을 생활화 하자!

매니페스트(androidManifest.xml)에 다음 플래그 지정!
<application android:icon="@drawable/icon" android:lable="@string/app_name"
          android:debuggable="true">

실장비 사용시
장비 셋팅 메뉴에서 USB Debugging 옵션 켜 두어야 함.

 단축키  설명
 F5 메서드 안으로 추적해 들어간다 
 F6 다음 명령문을 실행한다. 
 F7 메서드의 끝까지 실행하고 리턴한다. 
 F8 다음 중단점까지 실행한다. 
 Ctrl + R 커서가 있는 지점까지 실행한다. 
 Ctrl + F2 디버깅 중단. 



                리스너                콜백                    트리거 
 OnkeyListener onKey()  포커스된 화면뷰에 대해 물리적인 키를 누름 
 OnTouchListener onTouch()  화면을 터치합니다. 
 OnCilckListener onClick()  화면 버튼을 짧게 클릭합니다. 
 OnLongClickListener  onLongClick() 컨텍스트 메뉴를 길게 누름. 
 OnCreateContextMenuListener onCreateContextMenu()  컨텍스트 메뉴를 길게 누름. 
 OnFocusChanged OnFocusChanged()  설정한 뷰로부터 포커스가 이동한 경우 

안드로이드 콜백 함수란?

SMART_Phone/Android 2011. 1. 10. 20:45 Posted by Request
(버튼,스위치 등 - 트리거)이벤트 발생 -> 리스너 응답 -> 리스너, 해당 콜백함수 호출

Callback 함수
콜백 함수를 쓰면 이벤트의 발생을 감지하기 우이한 처리와 그 이벤트를 일어났을 때, 실행할 각각의
처리를 나누어서 코딩할 수 있습니다.

프로그래머가 그 함수의 사용을 명령해 주는 것이 아닌 이벤트, 메세지, 알람등을 받았을 때 자동으로 실행되는 함수를 말함.
대부분 On으로 시작되는 함수들은 대부분 콜백함수 임.



 private void clearApplicationCache(java.io.File dir){

if(dir==null)
dir=getCacheDir();
else{}
if(dir==null)
return;
else{}
java.io.File[] children =dir.listFiles();
try{
      for(int i=0;children.length;i++)
           if(children[i].isDirectory())
               clearApplicationCache(children[i]);
           else childen[i].delete();
}
catch(Exception e){}
}
public void onDestroy(){
super.onDestroy();
clearApplicationCache(null);
}

public void clearApllicationCache(){
       File dir=new File("/src/ss");
       if(dir !=null && dir.isDrectory()){
     try{
           ArrayList<File> stack=new ArrayList<File>();
          File[] children =dir.listFiles();

           for(File child : children){
              stack.add(child);
           }

          while(stack.size() > 0){
             File f=stack.get(stack.size() - 1);

             if(f.isDirectory() == true){
                boolean empty = f.delete();
 
                if(empty == false){
                     File[] files = f.listFiles();
                        if(files.length !=0){
                          for(File tmp : files){
                                 stack.add(tmp);
                        }
                 }
             }else(stack.remove(stack.size() -1);
             }
             }else{
                f.delete();
                 stack.remove(stack.size() -1 );
                }
             }
             }catch(exception e){
                Log.e("cntrl->", "Failed to clean the cache" + e.getMessage());
 return;
}
}


안드로이드 Title 바 없애기

SMART_Phone/Android 2011. 1. 10. 17:10 Posted by Request
[1.매니페스트 안에서 수정하는 방법]
1.1.Application 레벨에서 수정하는 방법
            <application android:icon="@dravable/icon" andorid:label="@string/..."
andoroid:theme="@android:style/Theme.NoTitleBar">

1.2.Activity레벨에서 수정하는 방법
<activity android:name=".stringMain" ... android:theme="@android:style/Theme.NoTitleBar">

[2.자바 소스 레벨에서 수정하는 방법]
2.1)requestWindowFeature(int featureId) 함수를 사용
public void Oncreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new StringView(this));
2.2)SetTheme(int resid)
-setTheme(android.R.style.Theme_Translucent_NoTitleBar)
public void Oncreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Translucent_NotitleBar);
setContentView(new StringView(this));

[3.전체 화면 모드 ]
-전체화면 상태로 만들기 위해서는
 
1.2.Title Bar(Activity모드) 만 없는 상태에서
배운 함수(requestWindowsFeature(int featureId) 제외에서 Theme.NoTitleBar로 적혀 있는 부분을
Theme.NoTitleBar.Fullscreen으로 수정해주면 됨.

2.자바소스에서 수정할려면,
SetTheme(android.R.style.Theme_NoTitleBar_Fullscreen)

참고 사이트 : http://blog.naver.com/pirate2003?Redirect=Log&logNo=40114476922