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

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(허니콤)이 공개되면서 태블릿에 적합한 여러 UI들이 공개되었는데, 그 중에서 대표적인 것이 바로 플래그먼트(Fragment) 입니다. 플래그먼트는 태블릿과 같은 큰 화면을 가지는 단말에서 애플리케이션이 화면을 더 효율적으로 활용할 수 있도록 도와 줍니다.

기존에는 애플리케이션 화면을 구성하는 큰 틀이 액티비티(Activity) 하나였고, 이 안을 여러 뷰로 구성하여 정보를 표시하고, 상호 작용을 수행했습니다. 그런데, 뷰만을 사용해서 다양한 내용을 보여주기는 매우 어려웠습니다. 특히나 전체적인 UI 틀은 고정되어 있으면서 특정 부분만 변화하며 다른 내용을 표시하도록 하려면 매우 복잡한 구성이 필요했고, 서로 다른 역할을 하는 코드들이 같은 곳에 있게 되어 가독성도 떨어지고 유지보수에도 악영향을 미쳤습니다. 그래서 대부분의 애플리케이션에서는 뷰 처리의 어려움도 피하고, 코드도 분리하기 위해 액티비티 전환을 사용했습니다. 하지만 화면이 큰 단말에서는 이 방식의 구성이 화면을 쓸데없이 많이 차지한다는 단점을 가지게 됩니다. 

그래서 등장한 것이 한 화면에 가급적 다양한 정보를 표시할 수 있는 플래그먼트입니다. 플래그먼트는 액티비티처럼 관련된 코드를 한곳에 묶을 수도 있고, 일반 뷰처럼 애플리케이션 레이아웃에 플래그먼트를 자유롭게 배치할 수도 있습니다. 즉, 한 화면에 여러 플래그먼트가 표시됨과 동시에 각 플래그먼트들을 조작하는 코드들은 각각 분리되어 있는 것이죠. 아래의 허니콤용 G메일 앱을 보면 플래그먼트의 이러한 특징을 확인 할 수 있습니다.


   
출처 : 커니의 안드로이드 이야기  




플래그먼트의 생애 주기  

플래그먼트는 액티비티와 같이 플래그먼트의 상태가 계속해서 변하며, 상태가 변할 때마다 그에 해당하는 생애 주기 메서드(콜백 메서드)가 호출됩니다. 플래그먼트의 생애주기 메서드 및 각 메서드의 호출 순서는 다음과 같습니다.

         출처 : 커니의 안드로이드 이야기


  • onAttach(Activity) : 플래그먼트가 액티비티 레이아웃에 포함되는 순간 호출됩니다. 액티비티 레이아웃에 플래그먼트를 정적으로 배치했다면 액티비티가 시작될 때 같이 호출되며, 동적으로 레이아웃에 추가할 땐 플래그먼트를 레이아웃에 추가하는 순간 호출 됩니다.
  • onCreate(Bundle) : 액티비티의 onCreate() 콜백 메서드와 유사하게 플래그먼트가 최초로 생성될 때 호출됩니다.
  • onCreateView(LayoutInflater, ViewGroup, Bundle) : 플래그먼트의 UI를 구성하는 뷰(View)를 반환합니다. UI를 가지지 않는 플래그먼트일 경우 null을 반환할 수도 있습니다.
  • onStart() : 플래그먼크가 화면에 표시될 때 호출됩니다. 하지만, 아직 사용자와 상호작용은 할 수 없는 상태입니다.
  • onResume() : 플래그먼트가 사용자와 상호작용을 할 수 있게 되었을 때 호출됩니다. 즉, 플래그먼트가 완전히 화면에 표시되어 제 역할을 수행할 수 있게 된 상태입니다.
  • onPause() : 액티비티의 onPause()와 유사하게 플래그먼트가 사용자와 상호작용을 할 수 없게 될 때 호출됩니다. 플래그먼트가 아직 화면에 표시되고 있는 상태이나, 다른 요소에 의해 플래그먼트가 가려져 상호작용을 하지 못하는 상태입니다.
  • onStop() : 플래그먼트가 화면에서 보이지 않게 될 때 호출됩니다. 액티비티가 화면에서 보이지 않게 될 때 onStop() 메소드가 호출 되는 것과 유사합니다.
  • onDestroyView() : 플래그먼트가 화면에서 사라진 후, 뷰의 현재 상태가 저장된 후 호출됩니다. 여기에서 저장된 뷰의 상태는 액티비티와 유사하게 Bundle 형태로 저장되며, 저장된 뷰의 상태는 onCreate() 및 onCreateView()에서 다시 불러들일 수 있습니다. 
  • onDestory() : 플래그먼트가 더 이상 사용되지 않을 때 호출됩니다.
  • onDetach() : 플래그먼트가 액티비티 레이아웃에서 제거될 때 호출됩니다.



플래그먼트의 서브 클래스  

플래그먼트를 상속한 서브 클래스로는 DialogFragment, ListFragment, PreferenceFragment 등이 있습니다. 

  • DialogFragment : 다이얼로그를 화면에 띄웁니다. 
  • ListFragment : 아이템들을 리스트로 화면에 표시합니다. ListActivity와 동일하게 Adapter를 이용해 리스트를 뿌립니다. ListView와 관련된 주요 메소드들도 제공합니다.
  • PreferenceFragment :  PreferenceActivity와 유사합니다. 설정 화면을 만드는데 유용하게 사용될 수 있습니다.





※ 플래그먼트에 대한 더 자세한 내용은 안드로이드 개발자 사이트를 참고하시면 됩니다.
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 플라스틱라디오


맨 위로