Android2009. 12. 31. 14:26

 

기본 클래스

Test1.java

public class Test1 extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new DrawTest(this));

 

}

}

DrawTest.java

public class DrawTest extends View {

    

    public DrawTest(Context context) {

        super(context);

    }

 

    @Override

    protected void onDraw(Canvas cvs){

        int iA = 0xFF;//alpha value

        int iR = 0x00;//red value

        int iG = 0xFF;//green value

        int iB = 0x00;//blue value

 

        Paint paint = new Paint();

        String sDrawStr = "DrawText";

        String sAlphaStr = " ";

        int iStrLeng = 0;

        for(int i=15;i<cvs.getHeight();i+=15){

            paint.setColor(Color.argb(iA-i, iR, iG, iB));

            sAlphaStr = " <- Alpha Value ("+(iA-i)+")";

            iStrLeng = sAlphaStr.length()+sDrawStr.length();

            cvs.drawText(sDrawStr+sAlphaStr, 0, iStrLeng, 0, i, paint);

        }

    }

}

 기존에 Activity가 xml을 참조하던 것과는 달리 View객체를 받은 DrawTest라는 사용자가 만든 클래스를 참조하게 만든다. DrawTest에 onDraw(Canvas cvs) 에 그려줄 내용들을 적으면 화면에 뿌려진다.

위의 소스는 글자를 뿌려주기 위해 만들었고 덤으로 Alpha 값에 대한 것도 알아볼 수 있다.

여태 Color를 RGB값만 쓰던 나를 당황시켜준 값이 Color가 ARGB를 쓴다는 것. 아예 기본적인 Color에 Alpha값 까지 플러스되서 오히려 엄청 편하게 됐다. 처음에 paint.setColor 로 색상값을 정해줄 때 당연히 RGB값만 들어가는 줄 알고 작성했다가 한 시간을 오류와 씨름했다.

 결과값

 

알파값에 따른 불투명 효과
알파값이 –값이 나오더라도 결과값이 나온다.

Posted by ™설야
Android2009. 12. 30. 17:03

 

Message.java – onBackPressed()

@Override
public void onBackPressed() {
    if( getValue == SAVE_COMPLETE ){
        Intent intent = new Intent(Message.this, Memo.class);
        startActivity(intent);
    }else{
        finish();
    }
    return;
}

 

Message.java – onKeyDown()

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        if( getValue == SAVE_COMPLETE ){
            Intent intent = new Intent(Message.this, Memo.class);
            startActivity(intent);
        }else{
            finish();
        }
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

 Android Developers blog 를 참조하다가 키에 대한 정의를 내릴 수 있는 메소드의 내용이 있어 이전버튼에 대한 정의를 내려주지 못해 day2:간단한 메모장 만들기(진행중) 에서 오류를 뿜어주던걸 하나 수정했다.
Android Developers blog 에 올라와있는 내용이 딱 나한테 필요한 내용이였던 것이다. ㅋㅋ onBackPressed()는 단순히 이전버튼에 대한 정의만 내려주고 onKeyDown()은 에뮬레이터상 대부분의 버튼에 정의를 내려줄 수 있다. 두개의 메소드 모드 작성되어 있다면 에뮬레이터에서는 onBackPressed()는 무시하고 이전버튼을 눌렀을때도 onKeyDown()으로 들어가버린다.

Posted by ™설야
Android2009. 12. 30. 16:13

Day2에서 구현 못한 파일 오픈과 관련된 기능을 추가.


구현 내용

  1. 메뉴 구성 : day 2
    - 타이틀 제목/New/Open/Exit 로 구성
  2. New 버튼 : day 2
    - 메모입력창을 띄운다.
    - 텍스트입력창 (상단) : 메모의 내용을 입력받는다.
    - 텍스트입력창 (하단) : 한줄로 메모의 내용을 저장시킬 파일 이름을 입력 받는다.
    - 버튼 (SAVE) : 바로 저장해 버린다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  3. Open 버튼 : day 3
    - 저장되어 있는 파일들을 보여준다.
    - 사용자가 파일을 선택하면 스크롤 뷰 레이아웃을 이용해 내용을 보여주기만 한다.
    - 버튼 (EDIT) : 읽고있는 내용을 메모입력창으로 보내 사용자가 편집할 수 있게 한다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  4. Exit 버튼 : day 2
    - 어플 종료

구현 결과

 

  • 초기 메뉴에서 Open 버튼을 눌렀을 때.

    새로운 Activity 사용(List Activity)

  • 파일 리스트 중 하나를 클릭 했을 때
    1.맨 윗줄에 파일 이름을 보여준다. (TextView)
    2.파일내용을 보여준다.(TextView)
    이 TextView에는 ScrollBar가 구현.
    3.하단부에 EDIT 버튼 추가
    EDIT버튼 클릭시 Day2에서 사용된 Edit Activity를 그대로 사용하며 파일 이름과 내용을 보내준다.
    4.DEL버튼 추가
    열린 파일을 거침없이 삭제 해버린후에 창을 닫고 삭제 완료 메시지를 보여준다. Day2에서 사용된 Message Activity에 메시지 추가

  • 위 파일 오픈 창에서 EDIT버튼을 눌렀을 때
    Day 2 에서만든 Edit Activity 를 불러온와 파일 내용을 수정 할 수 있게 한다.

  • 파일 오픈 창에서 DEL 버튼을 눌렀을 때
    파일이 지워졌다는 메시지창을 보여준다.

 

주요 코드

리스트에서 선택된 position 받아와 선택된 파일읽어 오기

String[] sReadFile = new String[2];        //[0] 파일이름 , [1] 파일내용

public void setReadFile(int pos){

sReadFile[FILENAME] = mFileList[pos];

    try {

        FileInputStream fis = openFileInput(mFileList[pos]);

//파일 크기만큼 buffer 열기

        buffer = new byte[fis.available()];                

//버퍼안에다 넣기

        fis.read(buffer, 0, fis.available());            

//byte string으로 변환 readFile에는 메모의 내용이 들어간다

        sReadFile[FILECONTENT] = byteToString(buffer);    

        fis.close();

    } catch (Exception e) {

        e.printStackTrace();

    }

}

byteToString 메소드

public String byteToString(byte buffer[]) {

    char[] cBuffer = new char[buffer.length];

 

    for(int i = 0 ; i < buffer.length ; i ++)

        cBuffer[i]=(char)buffer[i];

 

    return new String(cBuffer);

}

ListActivity 사용

public class OpenList extends ListActivity implements Variable{

    /** Called when the activity is first created. */

String[] mFileList; //파일리스트 받아올 String배열

      

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

 

if( fileList().length != 0 ){

    mFileList = fileList();

this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mFileList));

 

}else{

    //파일이 없다는걸 표시해 줘야 한다.

}

 

}

}


어설프게 모양새는 갖춰졌지만 에뮬레이터에서 테스트하며 뿜어내는 오류들 고쳐야하는데 ;;;

ㅜㅠ Activity 이동할 finish(); 사용한 부분도 있지만 그렇지 않고 이동할땐 finish();

한것과 안한것의 차이는 뭔지, finish();대신에 startActivity(intent); 불려지는거랑 차이가 뭔지 궁금

하다.

 

파일을 지워주고 리스트를 다시 받아오기 위해

mFileList = fileList();

this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mFileList));

부분을 다시 불러왔는데 에뮬레이터에서 테스트할때는 문제가 없었지만 뭔가 찜찜하다;;


파일보관용


 


Posted by ™설야
Android2009. 12. 29. 19:20

  Day1에서 공부한 내용에 파일 입출력만 추가시켜주면 될 줄 알았는데 어제 공부한거 다 까먹었다. ㅜㅠ
파일 입출력에 관한 내용만 공부하려다 어제 공부한거 복습도 할겸 해서 생각한 테스트 어플이 메모장이였는데 정말 간단히 만들자 생각해서 간단할 줄 알았는데 힘들다 힘들어 ㅜㅠ;; 간단한 것도 이렇게 힘들줄이야~

구현 내용
  1. 메뉴 구성
    - 타이틀 제목/New/Open/Exit 로 구성
  2. New 버튼
    - 메모입력창을 띄운다.
    - 텍스트입력창 (상단) : 메모의 내용을 입력받는다.
    - 텍스트입력창 (하단) : 한줄로 메모의 내용을 저장시킬 파일 이름을 입력 받는다.
    - 버튼 (SAVE) : 바로 저장해 버린다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  3. Open 버튼 - 아직 미구현
    - 저장되어 있는 파일들을 보여준다.
    - 사용자가 파일을 선택하면 스크롤 뷰 레이아웃을 이용해 내용을 보여주기만 한다.
    - 버튼 (EDIT) : 읽고있는 내용을 메모입력창으로 보내 사용자가 편집할 수 있게 한다.
    - 버튼 (MENU) : 초기 메뉴로 나가버린다.
  4. Exit 버튼
    - 어플 종료

구현 결과


초기 메뉴 구성
  • LinearLayout을 사용해서 간단하게 구현.
    - 별거 없다 ㅡ.,ㅡ;;

















NEW버튼 클릭시 메모 입력창 구현
  • RelativeLayout을 사용해 하단 버튼 부분부터 시작해 android:layout_above를 이용해 차례대로 구현.
    메모 내용을 입력받을 EditText창은 가로, 세로 fill_parent로 채우고 android:layout_above와 android:layout_below를 이용해 나머지 부분
    을 모두 사용 할 수 있도록 정렬 시킴.
  • 내용 입력 EditText에 android:scrollbars="vertical" 를 추가시켜 내용이
    많으면 자동으로 스크롤바가 생기게 한다.
  • 메시지만 보여주는 액티비티를 만들어 에러사항이나 경과를 사용자에게
    알려준다.
    - SAVE버튼을 눌렀을때 경우의 수
      (경우1) 파일이름 정해주는 공간이 비어있다
      (경우2) 지정한 파일 이름이 이미 존재 한다.
      (경우3) 아무 문제없이 저장 완료








SAVE버튼을 눌렀을 때의
메세지 출력
- 하나의 액티비티에서 각기 다른 메세지를 출력 할 수 있게한다.


- 아무 이상이 없을 경우 파일을 저장한 후 OK버튼을 누르면 모든 상황을 종료하고 초기 메뉴로 나간다.







- 파일 이름을 입력 받는 곳이 비어있을때.








- 저장할 파일 이름이 이미 있을때.
  







 
일반 윈도우 메모장을 사용해 저외의 경우의 수도 생각하여 추가로 만드는것도 공부에 도움이 될듯하다. 저장을 완료하고 초기 메뉴로 넘어가지 말고 저장된 내용을 스크롤 뷰를 통해 보여준다던지 저장할 파일 이름이 이미 있을땐 덮어씌울건지 물어본다던지 등등등. 
다! 걍 넘어가야 겠다. ㅋㅋㅋ
( 걍 파일 입출력만 테스트 해보고 넘어갈걸 그랬나 ㅜㅠ )



파일 입출력 - 저장 부분 주요 메소드
        try {
            EditText et = (EditText)findViewById(R.id.et_edit);
            byte[] buffer = stringToByte(et.getText().toString());                 
            FileOutputStream fos = openFileOutput(sName, Context.MODE_PRIVATE);
            fos.write(buffer);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Intent intent = new Intent(Edit.this, Message.class);
        intent.putExtra("WARNING", SAVE_COMPLETE);
        startActivityForResult(intent, 0);
    }

 아직 파일을 열어보기까지는 구현을 못시켜서 저장된 파일을 직접 확인해 보려고 하드디스크를 열심히 찾아봤지만 없었다. 직접 찾지는 못하고 file.getPath()로 확인해보니 저장되어 있는 곳이
/data/data/<package name>/app_(filename).txt 였다. apk파일도 풀어보고 이곳저곳 다 찾아봤지만 안드로이드 에뮬레이터가 보안을 위해 꼭꼭 숨겨논거라 판단하고 넘어갔다. ^___^
 위 코드에서 byte배열인 buffer에 string값을 byte로 변환한걸 다시 byteToString 메소드를 이용해 확인해보니 저
장된 값은 문제 없었다.







 만들면서 발견한 문제들


1.
EditText 입력창에 글자를 치려고만 하면 하단부분에 키보드가 나와버려 레이아웃에 구현한 화면 자체들이 모두 올라가 버려 화면처럼 수정중인 글자를 확인 할 수가 없게 된다. ㅜㅠ;;

2. 처음 EditText 입력시에 화면의 세로 사이즈의 중앙에 커서가 위치해 있다.

3. 메세지 출력창(저장완료버튼)에서 OK버튼을 누르면 finish()를 통해 액티비티들을 모두 종료시킬 수 있었지만 에뮬레이터의 
(이전)버튼도 보여주는 창을 닫는기능때문에 버튼에 대한 정의를 내려줘야 하는데 리스너를 찾지 못해 이전 버튼을 누르면 finish()가 안되고 오류를 뿜어 버린다.


















소스 보관

Posted by ™설야
Android2009. 12. 28. 21:19


  새로운 Activity를 보여주거나 서로 연계되어 값을 보내고 받기 테스트.

구현 내용
 1. Activity 는 3개를 만든다. (입력 Activity, 출력 Activity, Help Activity)
 2. 입력 Activity는 사용자로 하여금 이름을 입력받게 한다.
 3. OK버튼을 누르면 출력 Activity로 전환되면서 사용자가 입력한 메세지를 출력하고 OK버튼을 누르면 그 값을 입력 Activity에 뿌려주고 Cencel을 누르면 아무변경없이 그냥 입력 Activity로 이동한다.
 4. 입력, 출력 Activity에 Help버튼을 만들어주고 눌렀을때 Help Activity로 특정값을 보여주게 한다.
 5. Help Activity에서는 Go Back버튼을 만들어 눌러주게 되면 Help버튼을 눌렀을때의 Activity로 이동한다.


구현 결과

사용자 이름을 입력받는 창

- RelativeLayout 사용


















입력받은 내용 확인 시켜주기

- LinearLayout 두개 사용.
첫번째 LinearLayout은 차례대로 TextView 두개를 Vertical 형식으로
뿌려주고 하단부분 새로운 LinearLayout을 사용해 Horizontal 형식으로
뿌려주기
- android:theme 사용
AndroidManifest.xml 에 추가된 Activity의 값에
android:theme="@android:style/Theme.Light 넣어주기
재미난 효과를 기대했는데 단지 배경화면을 하얗게 바꿔준다. -_-;;
이러면 해당 xml의 레이아웃에 background를 흰색으로 바꿔주는거랑
뭐가 틀린건지;;;









확인된 이름을 입력 Activity에 뿌려주기

 EditText창에 첫 화면에서 이름값을 입력한 값이 남아 있길래.
edit.setText("");
로 초기화 시켜줌
















Help버튼을 눌렀을때 새로운 Activity로 임의의 값 보여주기

- android:theme 사용
AndroidManifest.xml 에 추가된 Activity의 값에
android:theme="@android:style/Theme.Dialog 넣어주기
오~ 이건 좀 새로운 효과를 보여준다.
단,  android:layout_width가 고정값이 아니면 창이 이상하게 표현된다.














android:theme 관련 API
http://developer.android.com/reference/android/R.style.html

 3개의 activity를 사용한것 뿐인데 익숙하지 않은 id참조와 각 activity간에 연결이 쉽게만 느껴지지 않는다. xml의 id값들도 다 변수로 취급해야하는데 변수값 지정에도 신경써야 할 것 같다.


소스보관

Posted by ™설야
Android2009. 12. 28. 16:36

Day 1


 LinearLayout 은 수평이나 수직 순서대로 찍어준다는걸 대략 알고 넘어가고 RelativeLayout을 통한 테스트를 해보았다.


위 화면에 적용한 layout 관련 코드
android:layout_below="@id:target"
- target 보다 아래에 위치 하게 된다.( 위 화면에서 Button2 에 적용)
android:layout_above="@id:target"
- target 보다 위에 위치 하게 된다.(위 화면에서 Button1 에 적용)
android:layout_centerVertical="true"
- 화면상 세로 중앙에 위치
android:layout_centerHorizontal="true"
- 화면상 가로 중앙에 위치
android:layout_centerInParent="true"
- 화면 중앙에 위치(layout_centerVertical, layout_centerHorizontal 두개를 모두 적용시킨것과 동일한 효과)
android:layout_alignParentLeft="true"
- 화면 좌측에 정렬.(위 화면에서 aParentLeft 버튼에 적용)
android:layout_alignParentRight="true"
- 화면 우측에 정렬.(위 화면에서 aParentRight 버튼에 적용)
android:layout_alignParentBottom="true"
- 화면상 하단부에 표시(위 화면에서 android:layout_centerHorizontal="true"을 적용시켜 Reset 버튼에 적용)
android:layout_alignRight="@id:target"
- target을 우측 안쪽으로 정렬시켜 표시.(위 화면에서 aRight 버튼에 적용)
android:layout_alignLeft="@id:target"
- target을 좌측 안쪽으로 정렬시켜 표시.(위 화면에서 aLeft 버튼에 적용)
android:layout_toLeftOf="@id:target"

- target을 좌측 바깥쪽으로 정렬.(위 화면에서 toLeftOf버튼에 적용)
android:layout_toRightOf="@id:target"
- target을 우측 바깥쪽으로 정렬.(위 화면에서 toRightOf버튼에 적용)

  하~ Java만 알면 무난히 할 수 있을거라 생각했는데 처음 접해보는 XML때문에 난이도가 급상승. ㅜㅠ
 직접 코드들을 테스트하며 공부 중인데 테스트할 코드들이 수없이 많다. 분명 어플 제작할때 사용할것은 일부일테고 이클립스 자동완성 기능을 이용하면 되니 적용시켜 테스트 후 블로그에 작성하며 복습한 후 후딱 후딱 넘겨야겠다.




Posted by ™설야
Android2009. 12. 23. 07:09


i1)안드로이드 에뮬레이터

 안드로이드 어플을 개발해 보고자 책을 사서 하라는데로 개발 준비를 위해 이것저것 설치해 보았지만 역시 쉽지않았다. 구글링을 통해서 안드로이드 포럼(http://androidforums.com/) 이란 곳을 발견하고 가입하고 안되는 것에 대해서 되지도 않는 영어를 조금씩 번역해가며 우여곡절 끝에 개발 준비 완료.
 예전 이클립스를 가지고 WTK(Sun Java Wireless Toolkit)를 설치 실행해보았는데 에뮬레이터 실행까지 매우 비슷한것 같다. 소스작성과 컴파일, 에뮬레이터 실행을 이클립스에서 한방에 그것도 쉽게 해결 수 있다는거에 대만족이다.

안드로이드 개발은 어떨지 아주그냥 흥미진진해 진다.

i2)모든 개발의 시작 Hello World 찍어보기

Posted by ™설야