'Android programming'에 해당되는 글 3건

  1. 2009.09.30 Parcelable Interface를 이용한 Activity 간에 데이터 전송
  2. 2009.08.20 Android Sudoku #3. 옵션메뉴, 게임 시작화면 구성 (2)
  3. 2009.08.15 초보는 모를 수도 있는 자투리 팁 (2)

Parcelable Interface를 이용한 Activity 간에 데이터 전송

|

개요. 

사용자가 작성한 클래스의 객체를 액티비티 사이에 자료 전송을 위하여 Parcelable 인터페이스를 사용한 방법IntentTest 액티비티의 EditText의 글의 내용을 SubActivity에 있는 TextView에 찍어내는 예제

레이아웃

메인 액티비티

SubActivity

얼핏 보기에는 아무런 별 문제가 없어 보인다. 임의로 id값에 숫자 110을 주었고 새로 생성할 액티비티의 패키지 이름과 클래스 이름을 주어서 인텐트 객체를 생성시키고 데이터 저장 형태인 Data객체를 생성해서 putExtra메소드를 이용해 데이터를 전송하고, SubActivity에서는 getExtra해서 얻은 Data객체에서 id:message를 TextView에 출력하는 것 처럼 보인다. 하지만 다음과 같은 화면이 기다린다.

putExtra에서 Data라는 근본모를 객체를 처리할 수가 없다면서 에러를 뱉어낸다. 왠지 건방지지만 어찌 건드릴 수 없는 포스를 뿜어낸다. 그러면 어떻게 해야 할까?? 원격 객체 제어하면서 보았던 Serialize를 떠올리거나 아니면 C에서 처럼 메모리 크기만 정해주고 그 크기만큼 입/출력 포인터에다가 냅다 써갈기는 방법들 말이다.

안드로이드에서 액티비티간의 데이터 전송 중 int, byte 같은 primitive 자료형 들은 별도의 작업없이 전송을 할 수 있지만 이 예제에서 처럼 사용자에 의해 정의된 객체를 전송할때에는 약간의 테크닉이 필요하다. 

Parcel Class 혹은 Parcelable Interface를 이용한 방법이 되겠다. 우선 가장 큰 도움이 되었던 예제는 다름아닌 Android References페이지에 있는 Parcelable Interface 항목이었다. 사용자 정의 클래스는 Parcelable 인터페이스를 구현(implements)시켜서 한번 정의해두면 각 액티비티에서는 별도의 작업없이 편하게(마치 원시 자료형 전송하듯) 전송할 수 있는 것이 장점인데. 여기서는 그렇게 하려고 한다. (그러지 않으면 전송 보내고 받을 때마다 Parcel객체를 생성해서 실어서 보내고 또 받는 쪽에서도 Parcel에서 다시 Data객체를 뽑아내는 작업을 해야 한다.) 

어쨌든 이를 참고로 만든 Data객체는 다음과 같다.

데이터 전송이 간단하다보니 클래스의 구성도 간단해서 별도의 주석이 더 필요하다고는 생각되지 않지만, 인터페이스를 구현하는데에 반드시 구현되어야 할 메소드들이 몇가지 있고(자동 생성된다) 또한 CREATOR라는 Parcelable.Creator 객체를 만들어줘야 한다는 점. 이렇게 Data클래스를 수정한 후 에뮬레이터에서 작동을 시킨 결과는 다음과 같다.

IntentTest액티비티에서 Data dt 객체를 직접 putExtra로 전달 한 뒤 SubActivity에서 Data temp 객체에 getExtra를 이용해서 받은 뒤 약간의 가공을 거쳐 TextView에 전달 받은 내용을 성공적으로 출력했다.

Trackback 0 And Comment 0

Android Sudoku #3. 옵션메뉴, 게임 시작화면 구성

|

1. 옵션 메뉴 생성

옵션메뉴는 D패드 위의 Menu버튼을 눌렀을때 나타나는 메뉴이며 지금은 그 메뉴 생성을 위해 필요한 이름값을 strings.xml에 집어넣는 것으로 시작한다.


이제 액티비티 클래스에서 옵션메뉴를 생성해야 하므로 Sudoku.java파일의 onCreateOptionsMenu메소드를 다음과 같이 구성한다. (Alt+Shift+S 후 v키를 누르면 Override/Overload할 수 있는 함수들이 나타나므로 익혀두자.) 

MenuInflater는 menu.xml의 메뉴정의를 읽어와서 실제화면의 메뉴로 '부풀린다(inflate)'.

다음은 옵션 메뉴의 항목이 선택되었을때의 동작을 결정한다

선택된 아이템의 id가 R.id.settings와 같다면 Settings.class(Settings.java) 액티비티를 시작 시킨다는 내용으로 이제 Settings.java를 생성할 차례

2. Settings 추가하기
안드로이드에서는 프로그램의 preference을 resource 파일들을 통해서도 정의 가능하다.

음악과 힌트의 설정을 변경할 CheckBox들의 설정을 정의하고 있다.
그리고 Settings.class를 PreferenceActivity를 확장하여 생성된다.

addPreferencesFromResource메소드가 xml에서 읽어온 preference들을 현재 액티비티의 view에 추가한다.
Settings.class에서 Activity를 확장했으니 Manifest파일에 적어주어야 한다.
여기까지는 아무일도 하지 않는 옵션메뉴를 만드는 과정이었다. 사실 뭐 어떤가... 아직 게임은 시작도 안되는데 >_<b


2. 새 게임 시작하기
New Game 버튼을 누르면 난이도를 설정한 뒤 각 난이도에 맞는 게임판을 불러오게끔 구성할 것이며 일단 시작은 언제나 그랬듯이 이에 필요한 문자열 정보들을 기록하며 시작한다.

난이도 목록을 resource로 관리하기

이제 Sudoku.java파일을 열어서 onClick()메소드에 다음과 같은 내용을 추가해서 New Game버튼을 눌렀을때 난이도 설정하는 메뉴가 보이게끔 설정해준다.

openNewGameDialog() 메서드는 난이도 설정을 위한 UI를 다룬다.

openNewGameDialog에서 난이도 설정하면 startGame()을 이용해 게임 시작한다. 하지만 본격적으로 게임 화면을 구성하기 전에 난이도 선택이 잘 되고 있는지를 확인하기 위해 Log를 통해 확인할 수 있는 코드로 대신

게임종료하기는 finishi() 메서드를 이용해 구현 할 수 있으며 일단 현재 프로그램에서도 사용할 수 있도록 Exit버튼에 연결한다. onClick()메서드에 switch구문 내에 다음 내용을 추가한다.



여기까지는 화면의 초기화면과 옵션, 난이도 메뉴를 이용하면서 기본적인 UI구성에 대해 알아보았고 이후로는 2D그래픽관련 함수들을 이용하여 실제 게임화면과 게임에 사용되는 논리부분 구현이 될 것이다.
Trackback 0 And Comment 2
  1. 잡학저장소 2009.08.22 05:05 신고 address edit & del reply

    님 좀 짱인듯

초보는 모를 수도 있는 자투리 팁

|
나도 초보자지만 이제 곧 책펴들고 예제따라하려는 분들을 위한 팁 몇가지...

팁1. 에뮬레이터는 끄지 말고 계속 켜두기
예제 하나 할때마다 에뮬레이터 켰다 껐다 하는 사람이 많은데...사실 누가 미리 말 안해주면 그렇게 할 가능성이 높은게, 나같은 경우만해도 C, JAVA이런거 공부하면서 들여왔던 습관이 그것이라 안드로이드 시작할때도 똑같이 했는데, 영원처럼 느껴지는 에뮬레이터 구동속도때문에 속앓이 많이 했었다. 하지만... 에뮬레이터를 켜두고 프로젝트를 빌드시키면 에뮬레이터에 어플리케이션이 재설치가 되면서 작동이 된다. 고로, 에뮬레이터 한번 켜두면 그 기나긴 에뮬레이터 구동시간을 절약 할 수가 있게된다.

팁2. Life cycle of an Android activity
이것은 반드시 숙지해둬야할 내요이지 싶다. 각 상자들은 상태를 의미하고 화살표 주변의 함수이름들은 각 상태들이 전환되면서 호출되는 함수들을 보여준다. 

팁3. 이클립스 개발시 Log Cat을 살펴보자
코딩을 하다보면 에뮬레이터를 작동시켜보며 버튼이 잘 작동하나 안하나 확인하고플때가 있는데, 그렇다고 간단한 소스 변경해볼려고 디버그모드 전환해가며 브레이크 포인트설정하고 이러는게 상당히 번거롭다. 그럴때 도움이 될만한 팁이다.

1. 이클립스의 개발 시점(perpective)에 Log cat창을 하나 추가..
Window - Show View - Other - Android - Log cat한 뒤 콘솔창 옆에 추가가 된다.


2. 소스에 Log활용하기
여기선 어떤 클래스의 어떤 함수에서 어떠한 이벤트를 처리하는지 표시하는 로그 추가
Sudoku.java
private static final String TAG = "Sudoku"; //Sudoku.class를 위한 택
private static final boolean logFlag = true; //Log가 보고 싶지 않을땐 false,
....

@Override
public void onClick(View v) {
String method_tag = ".onClick();";
// TODO Auto-generated method stub
switch(v.getId()) {
case R.id.about_button :
if (logFlag) Log.d(TAG+method_tag, method_tag+"about_button is clicked");
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.new_button :
if (logFlag) Log.d(TAG+method_tag, "new_button is clicked");
openNewGameDialog();
break;
case R.id.exit_button :
if (logFlag) Log.d(TAG+method_tag, "exit_button is clicked");
finish();
break;
// more buttons go here (if any)
}
}
이런식으로 적용 시키면 다음과 같은 메시지를 LogCat창에서 볼 수 있을 것이다.


개발중에는 logFlag에 true, false로 메시지를 조절하고 핸드폰에 올릴때는 해당 소스들을 다 빼서 올리면 될 것이다. 아무래도 저런 코드가 남아있는 상태라면 어플리케이션의 용량이나 사용하는 메모리 면에서나 좋을 것은 없을 것이다. 

Trackback 0 And Comment 2
  1. 잡학저장소 2009.08.16 18:40 신고 address edit & del reply

    하앍, 괜찮게 정리해 놧는데

prev | 1 | next