커스텀 위젯에 사용자 속성을 정의하려면 아래의 순서를 따라야 합니다.

1. res/value/attrs.xml 에 사용자 속성을 정의
2. xml에서 사용자 속성을 사용하기 위한 namespace를 지정한 후 커스텀 위젯의 속성에 사용자 속성을 정의
3. 커스텀 위젯 소스코드(.java)에서 사용자 속성의 값을 가져와 사용





attrs.xml에 사용자 속성 정의  

아래와 같이 declare-styleable 태그 안에 attr 태그로 사용자 속성을 정의합니다. declare-styleable 태그안의 name 속성은 커스텀 위젯 소스코드(.java)에서 사용자 속성의 값을 가져오기 위해 사용됩니다. 
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<declare-styleable name="DragButton">
	    <attr name="button_src" format="reference"/>
	</declare-styleable>    
</resources>

attr 태그의 format 속성의 값으로는 boolean, integer, float, dimension, reference(id값), string, color(색상코드값), fraction, enum, flag 등이 사용될 수 있습니다.




xml의 커스텀 위젯에 사용자 속성 정의  

커스텀 위젯에 사용자 속성을 정의합니다. 이를 위해서는 먼저 사용자 속성을 사용하기 위한 네임스페이스를 지정해 주어야 합니다. (android 는 안드로이드에서 기본으로 제공하는 속성을 사용하기 위한 네임스페이스입니다.)

네임스페이스의 지정은 루트 태그안에 다음과 같이 명시하면됩니다. 이때 네임스페이스명은 자신이 원하는 이름으로 지정하면 되고, 애플리케이션의 패키지명 또한 정확히 지정해 주어야 합니다. (커스텀 위젯 소스코드의 패키지명이 아니라 애플리케이션의 패키지명임을 주의해야 합니다.)

xmlns:네임스페이스명="http://schemas.android.com/apk/res/애플리케이션의 패키지명"


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dragbutton="http://schemas.android.com/apk/res/com.plasticradio.footballtvguide"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <TextView 
        android:id="@+id/alarm_tv_test"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.plasticradio.widget.DragButton
		android:id="@+id/alarm_dragButton"
		android:layout_below="@id/alarm_tv_test"
		dragbutton:button_src="@drawable/drag_button_normal"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</RelativeLayout> 




커스텀위젯 소스코드에서 사용자 속성 사용  

커스텀 위젯 소스코드(.java)의 생성자에서 context, attr 파라미터 값을 이용해 TypeArray 객체를 생성한 후 이로 부터 xml에 정의했던 사용자 속성을 가져와 사용합니다.
public DragButton(Context context, AttributeSet attr) {
super(context, attr); //위젯의 Attribute 값을 가져와서 변수에 저장 TypedArray typedArray = context.obtainStyledAttributes(attr, R.styleable.DragButton); int dragBtnId = typedArray.getResourceId(R.styleable.DragButton_button_src, 0); }




참고 : 호군의 "Code 속으로"
Posted by 플라스틱라디오

출처 : 랩하는 프로그래머
Posted by 플라스틱라디오

지원 패키지란?  

지원 패키지는 안드로이드 3.0 플랫폼 버전 이후 추가된 API 및 유용한 유틸리티 API 들을 묶어서 만들어진 정적 라이브러리 입니다. 다시 말해, 허니콤에서 유용한 기능들을 기존의 안드로이드 플랫폼에서도 사용 가능하도록 공식적으로 릴리즈한 공개 라이브러리 입니다. (이전에는 호환성 패키지(Compatibility Package) 였는데 지원 패키지(Support Package)로 이름이 변경되었습니다.)

현재 동일한 인터페이스를 갖춘 v4와 v13 두 가지 버전이 제공되는데, v4는 안드로이드 API Level 4 (도넛) 버전을 기반으로 작성된 라이브러리이며, v13은 안드로이드 API Level 13 (허니콤) 버전을 기반으로 작성된 라이브러리 입니다. 따라서, 애플리케이션의 타겟 버전이 도넛, 이클레어, 프로요, 진저브래드인 경우에는 v4 버전의 호환성 패키지 라이브러리를 사용할 수 있고 허니콤, 아이스크림인 경우에는 v13 버전의 호환성 패키지 라이브러리를 사용할 수 있습니다.




지원 패키지의 기능  

지원 패키지에 담긴 주요 기능은 Fragment, Loader, ViewPager, Least Recently Used Cache 등입니다.

  • Flagment : Flagment는 하나의 동작 모듈이라고 할 수 있습니다. 지금까지는 대게 하나의 액티비티가 하나의 동작 모듈로 간주되었는데 허니콤 이후 멀티 패널 UI가 요구됨에 따라 액티비티가 여러 기능을 수행할 필요가 생겼습니다. 이에 따라, 액티비티 내에 하나 이상 포함될 수 있으면서 동시에 독립적으로 동작할 수 있는, 액티비티와 뷰 중간쯤의 위치에 Fragment 클래스가 추가되었습니다.
  • Loader : 메인 스레드가 아닌 별개의 스레드를 이용해 비동기적으로 데이터를 동작하고자 할 때 손쉽게 사용할 수 있는 Abstract 클래스 입니다.
  • ViewPager : 수평 화면 전환이 필요할 때 이를 손쉽게 구현할 수 있게 도와주는 위젯입니다.
  • Least Recently Used Cache : 간편하게 사용할 수 있는 Hash 로 최초 생성 시 Hash의 최대 크기를 지정할 수 있으며, 만일 지정된 크기보다 더 많은 아이템을 추가하려고 하는 경우에는 이전에 사용되었던 아이템(Least Recently Used)이 Hash에서 제거됩니다. 이미지 비트맵 등을 저장하는 캐쉬를 만들 때 유용합니다. 




지원 패키지의 사용  

지원 패키지의 사용을 위해서는 아래와 같이 ADT를 이용해 Android Support package를 인스톨해 주어야 합니다. 인스톨이 완료되면 Android SDK가 설치된 폴더의 /extras/android/support 폴더 안에 지원 패키지가 다운로드 됩니다.




정상적으로 설치가 완료되었으면 이클립스의 안드로이드 프로젝트에 아래와 같이 android-support-v4.jar 파일이 추가되고 안드로이드 지원 패키지에서 제공하는 클래스들을 사용할 수 있습니다.

 





출처 : 휴휴휴
Posted by 플라스틱라디오

Activity의 생명 주기  

Activity의 상태는 크게 활성(Activity), 일시정지(Pause), 정지(Stopped) 로 나눌 수 있습니다.

활성(Activity)
현재 화면에 Activity가 표시되는 상태이며, 사용자와 상호작용 할 수 있는 상태를 말합니다. 일반적으로 Activity가 화면에 표시되고 있을때를 의미합니다.

일시정지(Pause)
화면에는 Activity가 보이지만, 사용자와 상호작용 할 수 없는 상태입니다. 즉, 배경이 투명한 Activity나 화면 전체를 가리지 않는 Activity에 의해 본 Activity의 일부가 가려진 경우를 말합니다. Dialog의 경우는 Activity의 일부를 가리긴 하지만 Dialog도 Activity의 일부이기 때문에 Dialog가 띄워진 경우는 일시정지 상태가 아닙니다.

정지(Stopped)다른 Activity에 의해 완전히 가려진 상태입니다.


Activity는 위와 같이 크게 3가지 상태로 나뉘지만 정확히는 아래와 같은 7개의 상태로 나눠지게 됩니다. 
  • onCreate()

  • onStart()

  • onResume()

  • onPause()

  • onStop()

  • onDestroy()
  

Activity의 생명 주기

Activity는 생명 주기에 따라 상태가 변화하는데 이를 위해 각 상태에 해당하는 메소드가 호출됩니다. 따라서, 각 상태에 해당하는 메소드를 오버라이드 하면 특정 상태에서 원하는 작업을 실행시킬 수 있습니다.




Activity의 시작  

Activity의 생명 주기
           
Activity의 생성은 onCreate 메소드를 통해 이루어집니다. 따라서 onCreate 메소드에서는 Activity 초기화를 담당하는 코드들을 처리해주어야 합니다.

onCreate 메소드를 통해 Activity를 띄우기 위한 모든 준비가 완료되었다면, onStart 메소드를 호출해 Activity를 시작합니다. 하지만, 이 상태는 Activity가 완전히 화면에 표시된 상태가 아니라 Activity가 화면에 표시되기 직전의 상태입니다.

Activity의 화면 표시는 그 다음에 실행되는 onResume 메소드에 의해 이루어집니다. onResume 메소드는 Activity가 화면에 표시되고, 사용자와 상호작용하기 직전의 상태입니다.
 



Activity의 정지/일시정지  

Activity의 생명 주기

Activity가 화면에 표시되고, 사용자와 상호 작용할 수 있는 활성상태(Active)에서 다른 Activity에 의해 가려지거나 화면에서 사라지게 되면 그 Activity는 정지상태(Stopped)가 됩니다. 이때 실행되는 메소드가 onStop 입니다. 

일반적으로 정지상태에서는 사용자가 Activity를 다시 사용할 것을 대비하여 메모리에서 바로 사라지지 않고 올라가 있다가 사용자가 다시 Activity를 호출할 경우 Activity를 재생성 할 필요없이 화면에만 띄우면 되므로 onRestart - onStart - onResume 과정을 거쳐 다시 활성상태가 됩니다. 

만일, 정지상태에서 메모리 부족으로 메모리 확보가 필요한 상황이 되면 Activity는 강제 종료되어 메모리 상에서 사라지고 사용자가 Activity를 다시 호출할 경우 onCreate - onStart- onResume 과정을 거쳐 Activity가 재실행됩니다.


일시정지상태(Paused)는 Activity가 화면에 표시되고 있지만 사용자와 상호작용을 하지 않고 있는 상태이고 이때 실행되는 메소드는 onPause 입니다.

일시정지 상태에서는 일반적으로 사용자가 어떤 작업(예를 들어 어떤 문자열의 입력 등)을 진행중일 가능성이 높습니다. 그런데 이때 메모리가 부족하여 Activity가 종료된다면 사용자가 입력했던 테이터들이 손실됩니다.
따라서 이를 대비해 사용자의 입력 값등을 미리 저장해놓아야 하는데 이때 onSaveInstanceState 메소드를 이용합니다. onSaveInstanceState 메소드는 Activity의 종료전 상태를 Bundle 객체로 저장해 놓았다가 나중에 해당 Activity를 다시 실행할 때 onCreate 메소드나 onRestoreInstanceState 메소드에 Bundle 객체로 전달해 줍니다. 

onSaveInstanceState 메소드는 Activity가 강제 종료 되었을때만 호출되고, onRestoreInstanceState 메소드는 강제 종료된 Activity를 재실행 할때에만 호출되므로, 만일 Activity가 시작하거나 종료될 때 해주어야 할 작업이 있다면 이 두 메소드를 오버라이드 하는 대신 onCreate, onStop 또는 onDestroy 메소드를 오버라이드한 후 그 안에 코드를 구현해야 안정적으로 해당 작업을 처리할 수 있습니다. (참고로 만일 onSaveInstanceState 메소드가 실행된다면 onPause 혹은 onStop 메소드 이후에 호출되고, onRestoreInstanceState 메소드가 실행된다면 onCreate 메소드 다음에 호출됩니다.)
 




Posted by 플라스틱라디오


맨 위로