관련 글1 : http://bunhere.tistory.com/140 [Widget][예제]ListView with CursorAdaptor
관련 글2 : http://bunhere.tistory.com/153 [팁]기존에 생성된 (Sqlite3) DB를 안드로이드에서 이용하기

생성된 DB를 사용하는 것과 관련된 질문들이 많아 예제 프로그램을 작성해보았습니다.

옛날 만들었던 ListView with CursorAdaptor의 코드를 거의 그대로 들고 왔으나, DB를 만드는 부분은 153번의 initialize를 사용했습니다.

1. DB를 준비하자

먼저 DB 파일이 있어야 할 것입니다.
SQLITE3을 통해 아래와 같이 만들었습니다.(리눅스에서)

필요하신 분들을 위해 해당 파일 첨부합니다.

SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table lecture (_id integer, name);
sqlite> insert into lecture values(1, 'ryuan');
sqlite> insert into lecture values(2, 'yesum');
sqlite> insert into lecture values(3, 'mindong');
sqlite> .q

2. 새 프로젝트를 만듭니다.
생성하는 방법은 익히 아실거라 생각됩니다. 중요한 것은 Package name입니다.
com.sohon.testDB 으로 패키지명을 정한 경우
해당 안드로이드 어플리케이션은 위 패키지 경로가 지정한 곳에 생깁니다.
그리고 /data/data/com.sohon.testDB 아래에 패키지 관련 파일들이 아래 그림과 같이 생기게 됩니다.
DDMS의 일부를 캡쳐한 화면입니다. 상단에 /data/data/는 다른 프로젝트들 떄문에 같이 캡쳐하지 못한 점 양해 부탁드립니다.

일단 위와 같이 새 프로젝트 정보를 입력하고 Finish를 누릅니다.
그러면 이클립스 개발환경이 뜹니다.

3. 코딩하기
ActTestDB.java 파일에 아래와 같은 내용을 코딩합니다
아래 내용은 관련글1과 관련글2의 내용을 합쳐놓은 코드와 유사합니다.
꼭 필요한 부분만 설명드리겠습니다. 관련글1,2를 참고하시기 바랍니다.

먼저 onCreate에서 initialze(this)를 통해 DB 파일을 asset으로부터, /data/data/com.sohon.testDB/databases 아래로 복사할 것입니다.

그리고 setAdaptor를 이용해 m_listbox에 DB를 연결합니다.
이것을 위해 수정해야 할 정보는 먼저 ROOT_DIR, DATABASE_NAME, TABLE_NAME 입니다.

실행하시면 아래와 같은 결과를 얻으실 수 있습니다.
에뮬레이터 resolution이 좀 이상한 것은 제 에뮬레이터 해상도를 이상하게 맞춰놔서 그렇습니다.(테스트용)


Posted by 소혼

화면 유지 : 
PowerManager.WakeLock



WIFI 유지 : WifiLock

WifiManager wManager = (WifiManager)mCtx.getSystemService(Context.WIFI_SERVICE);
WifiLock wLock = wManager.createWifiLock("HandsWIFILock");
wLock.acquire();

//doing something

wLock.release();
Posted by 소혼
< 계속 업데이트 합니다. 질문 환영 >
10-06-18 초기 문서
10-08-28 팁 몇개 추가
10-11-30 팁 하나 추가

- Listview


말그대로 List이다. 한 개 이상의 항목을 담아 뿌려주는 것을 기본으로 한다.
ListView는 다소 복잡한 Control이나 빈번히 사용하게 될 Widget이다.
ListView의 보이는 영역은 Scrollbar, 각 Row Item들, Selector (구분자? seperator? ), Divisor 로 이루어진다.

Scrollbar
위 그림에서는 Gallery와 Grid에 걸쳐있는 회색 계통의 긴 막대를 말한다.
Scrollbar는 ScrollView를 참조하면 될 것 같다.

RowItem
각각의 Row에 저장하는 정보들을 표현한다. 여기에 저장할 수 있는 정보는 매우 다양할 수 있기 때문에 다양한 Adaptor 형태로 ListView에 제공된다.
가장 기본 적인 것은 ArrayAdaptor이고, Database를 위해 CursorAdaptor도 제공한다.
사용자가 직접 재정의해서 다양한 정보들을 넣을 수 있다.

android.R.layout.simple_list_item_1
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
 
          http://www.apache.org/licenses/LICENSE-2.0
 
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:minHeight="?android:attr/listPreferredItemHeight"
/>

Selector
Selector는 위 그림에서 Grid와 같이 사용자가 선택된 것을 알려주는 역할을 수행한다. 기본은 노란색 배경이라 너무 눈에 튀기 때문에 적당히 자신만의 Selector를 쓰는게 좋다.

Divisor
Divisor는 각 RowItem을 구분하는 역할을 하는 선을 말한다.

SectionIndexer, AlphabetIndexer
http://www.androidpub.com/97392
 

1) 만드는 법
   -
2) Adaptor 정리

3) style 바꾸는 법
   - selector 바꾸는 법
     selector를 바꾸는 법은 쉽다. 함수를 사용할 경우,
     mListView.setSelector(myDrawable);
   - background, foregound 바꾸는 법


4)

5) TIP
 a] 배경이 있는 Listview를 스크롤시, 회색이 나오는 문제
   android:cacheColorHint="#00000000" 을 추가
 b) 만약, listview의 아이템을 선택할 때 한 줄이 선택되지 않고 일부만 선택된다면 (textview가 있는 영역만 선택된다면)
   ListView의 layout_width="fill_parent" 속성을 확인할 것
 c) Custom ListView에서 Selector가 안보인다면,
   Selector의 기본 옵션은 Row 아래 깔리도록 되어 있는 것 같다. ListView 속성  
   android:drawSelectorOnTop="true"을 준다.
 d) ListView 아래 라인(Divisor) 제거하기
   listview.setDivisor(null);
 e) ListView 위아래 흐림 효과 막기
   android:fadingEdge="none"

6) 문제 해결
 setOnItemClickListener 가 동작하지 않을 때
 => 커스텀 뷰를 만들어서 쓸 경우, setOnItemClickListener가 동작하지 않는 경우가 발생했다. 문제는 커스텀 뷰에서 이벤트를 소비하고 있기 때문인데, 소비하는 부분을 찾아 제거해주는 것이 필요하다. 나의 경우, TextView와 marque 때문에 이런 문제가 발생했다. 3시간 소비 -_-;

* ListView 안의 custom textview에서 Ellipsize 쓰려면
    android:scrollHorizontally="true"
    http://stackoverflow.com/questions/1424276/ellipsize-not-working-for-textview-inside-custom-listview

참고 자료
http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html : 배경이 검게 나오는 것과 관련한 자료
http://blog.naver.com/PostView.nhn?blogId=kippee&logNo=130076565197&viewDate=&currentPage=1&listtype=0&userTopListOpen=false&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=undefined
http://www.androidguys.com
http://comma.byus.net/blog/2younow/trackback/6
Posted by 소혼
http://stackoverflow.com/questions/3535074/getview-vs-bindview-in-a-custom-cursoradapter

적혀있는 말은 간단히 말해
cursoradaptor를 custom으로 사용하면 getview에 해당하는 것이
newView와 bindView로 구현되므로 getView를 통해 구현할 필요 없다는 내용입니다.

'<안드로이드>개발 > 안드로이드/App' 카테고리의 다른 글

안드로이드의 Lock  (0) 2010.09.10
[Widget] List View  (0) 2010.08.28
CursorAdaptor에서 getView?  (0) 2010.08.28
TextSwitcher 기본  (0) 2010.07.19
안드로이드 마켓에 개발자 등록  (0) 2010.07.16
[팁] 안드로이드 SDK로 DB 내용 확인하기  (0) 2010.07.08
Posted by 소혼
TextSwitcher 는 Text를 변경하는데 사용하는 View입니다.
Text를 변경할 때 효과를 줄 수 있다는 장점이 있습니다.

다음 예제는 Apidemos에 나온 것과 동일한 내용을 다룹니다.
다른 점은 ApiDemos는 버튼에 반응하지만, 이 예제는 TextSwitcher를 한번 클릭할 때 반응합니다.

1. 기본 프로젝트를 생성합니다.
2. main.xml의 내용을 아래와 같이 수정합니다.

3. 소스 파일을 열고 아래와 같이 코딩합니다.

timeSwitcher.setFactory(this); 라는 문장은 매우 중요합니다.
이게 없으면  java.lang.NullPointerException 가 발생합니다.
setFactory를 추가하면 ViewFactory를 구현할 것을 요구합니다.

여기에 추가하는 View를 이용해 TextView를 생성하는 것 같습니다.

ps> 이런게 있는 줄 알았다면 좀 더 쉽게 만들었을 것을 이라고 뒤늦게 후회해보고 있습니다.
Posted by 소혼
드디어 안드로이드 마켓에 개발자 등록을 했다.

전화번호 입력에 한번 삽질을 하고

Billing Address가 뭔지 몰라 또 삽질을 했다.

전화 번호 입력할때 +82-{제일 앞 0을 뺀 전화번호}를 해야 한다.
예를 들어 +82-2-1234-5678

빌링 어드레스는 뭔지 몰라 그냥 집주소 입력

결제 대기 상태인듯 한데 기다리고 있다.

내일 간단한 테스트 앱을 하나 등록해봐야겠다.

Posted by 소혼

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

김선운님에게 도움이 될까 싶어 정리해봅니다.

안드로이드는 sqlite3을 쓰는데 sqlite3이 리눅스에서는 정말 사용하기 편하지만 윈도우에서 사용하려면 빌드까지 해야 하는 꽤 불편할 수 있습니다.

하지만 안드로이드 에뮬레이터 안에는 이미 sqlite가 있습니다.
이것을 활용하여 내가 만든 DB가 어떤 상태에 있는지 확인해 보고자 합니다.

1. 먼저 콘솔 창을 하나 띄웁니다.
시작 => 실행(R)을 클릭하고 cmd를 입력

2. 안드로이드 SDK가 있는 경로로 이동합니다.
   (저의 경우 h:\project\android2\android-sdk-windows\tools를 사용합니다.)
> cd h:\project\android2\android-sdk-windows\tools
> h:

3. adb 쉘에 접속합니다.
h:\project\android2\android-sdk-windows\tools> adb shell
#

4. 자신이 만든 프로젝트가 있는 곳으로 이동합니다.
이 때 리눅스 명령어들을 사용해야 합니다. 몇가지 정도만 알고 쓰시면 유용합니다.
 ls : 현재 폴더의 파일, 서브 폴더 목록을 출력합니다.
      ls는 권한이 없는 곳에서 수행하면 Permission denied 에러가 날 수 있습니다.
cd [폴더명] : 폴더명으로 이동합니다.
pwd : 현재 폴더 위치를 출력합니다.

경로는 /data/data/패키지명 입니다.
이전 DB 예제에서는 이 아래에 databases라는 폴더를 하나 더 만들었으므로 한단계 더 아래에 파일이 존재합니다.

# cd /data/data/com.sohon.sample
# ls
ls
play_seq.dat
shared_prefs
databases
lib
#

5. sqlite를 통해 데이터베이스 파일을 엽니다.
# sqlite3 databases/lecture.db
sqlite3 databases
SQLite version 3.5.9
Enter ".help" for instructions
sqlite>

6. sql을 통해 정보를 확인합니다.
sqlite> select * from sqlite_master;
select * from sqlite_master;
table|lecture|lecture|2|CREATE TABLE lecture (_id integer primary key, eng_sente
... 기타 테이블 커럼 정보들)
sqlite>

허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.
Posted by 소혼
출처 : http://psjin14.tistory.com/entry/AndroidGallery%EC%97%90-Image-%EC%B6%94%EA%B0%80-%ED%95%98%EA%B8%B0
ps> 예섬아, 이렇게 해도 되는 설정을 해놓고 있단다. CCL도 꼭 신경써서 보도록 하렴
약간의 코멘트 덧붙임
ps2> 궁금한 내용 있으시면 질문 주시면 답변 드립니다.

아래는 예섬이 장장 2시간 동안 적은 글 ㅋㅋ
근데 글자가 너무 많아서 읽기가 싫어진다 ;;
역시 난 소스 보는게 좋은 것 같다.

내가 Gallery에서 필요한 기능은 다음과 같다.
 Gallery 요구사항
  (1) Gallery에 내가 원하는 Image 추가하기
  (2) 사용자의 선택으로 인해, Gallery 중앙에 최정적으로 표시된 Image가 무엇인지 알기
    Ex>  Finger Flick을 하는 경우, Flick이 완료 될 때 화면에 선택된 Image 알기

이 2가지 요구사항을 만족할 수 있는 예제를 인터넷에서 찾았으니, 찾을 수가 없었다.

대신, Android Developer Guide에서 Hello, Gallery라는 예제를 찾았으나 !!

이런.. 그대로 작성하면, Error가 나거나 System이 오동작을 한다. ㅜ.ㅜ
  * Hello, Gallery url : http://developer.android.com/guide/tutorials/views/hello-gallery.html

몇 가지 시행착오 후,  요구사항을 만족할 수 있는 Android Code를 작성하였다.
 요구사항을 만족하여, 실행된 화면
 
  > Linear Layout에 Gallery와 Text View를 추가하였다.
> Gallery 상에서 Image의 위치를 표시하기 위해, Text View를 추가하였다.

(1) Layout으로 사용할 xml 파일 만들기
 파일명 : layout > my_gallery.xml
 

특별히 관계없는 기타 팁
  1)  Gallery에 Image View를 추가하지 않아도 된다.
     * Gallery에 Image를 추가하는 것은 Code 상에서 할 예정이다.

  2) Fling의 결과로 선택된 Image 위치(Position)를 알기 위해서, Text View를 추가하였다.

  3) Linear Layout의 default orientation은 horizontal이다.
     => 그러므로, 꼭 orientation을 vertical로 명시해 주자.
       -> 그렇지 않으면, Text View가 화면에 표시되지 않을 것이다.

(2) 실행화면의 각 Image에서 보이는 테두리 속성용 value 파일 만들기
 파일명 : values > gallery_attri.xml
 


(3) Activity 클래스 작성하기
 파일명 : src > ActMyGallery.java
 

  1) android.app.Activity를 Super Class로 지정하여, Class를 생성하자.

  2) OnCreate 함수를 Override하자.
       (a) 이 Activity가 실행될 때의 Layout을 설정하기 위해, setContentView 함수를 호출한다.
       (b) Gallery에 Image 추가 및 Image에 대한 정보를 알 수 있도록, Adapter를 설정해 준다.
            - Gallery 클래스의 setAdapter 함수 이용
            * ImageAdapter는 미작성 클래스임. 그래서 setAdapter 라인을 추가하는 순간, Error가 날 것이다

(4) ImageAdapter 클래스 추가하기
 파일명 : src > ActMyGallery.java
 

  1) BaseAdapter를 Super Class로 하는 Class를 작성한다.
    => 단, Activity 클래스 내에 작성해야 한다.
     -> 그렇지 않으면, 몇몇 함수들은 정의되지 않았다고 Error가 발생할 것이다.
    (꼭 그럴 필요는 없음)
  2) Gallery에 추가할 Image들을 res/drawable 폴더에 추가한다.

  3) 위 소스 코드의 핵심 함수는 getView가 되겠다.
    =>이 함수는 Gallery의 위치에 있는 Image View를 반환하는 함수이다.
      -> 이 함수에서, 각 Position에서 보여야 할 Image에 대한 설정을 해 주고 있다.
        (a) ImageView.setImageResource()
            : Image Resource ID를 설정하여, ImageView에서 표시 할 Image를 설정하고 있음

        (b) ImageView.setLayoutPrarms(new Gallery.LayoutParams(150, 100)
            : 150은 width이고, 100은 height임

        (c) ImageView.setScaleType(ImageView.ScaleType.FIT_XY)
           : Imae가 150X100에 맞도록, Scale을 조정함

       (d) ImageView.setBackgroudnResource(background)
          : 실행된 화면에서, 각각의 ImageView에 회색 테두리가 보이도록 함

  4) 생성자에 있는 아래 항목들은 이미 (2)번에서 작성한 내용들이다.
      - R.styleable.Theme
      - R.styleable.Theme_android_galleryItemBackground

  5) 수행하면, 1번째 요구사항이 만족된 것을 확인할 수 있음

(5) 2번째 요구사항을 만족하기 위해, onCreate 함수 수정
 파일명 : src > ActMyGallery.java
 onCreate 함수 안에 안의 내용을 추가하였음
  1) setOnItemSelectedListener 함수를 이용하면, 2번째 요구사항을 만족할 수 있다.
    => 정확히는 OnItemSelectedListener.onItemSelected() 이지만..
      -> 해당 함수의 3번째 인자로 들어오는 Int는 Galley 상의 Image 위치이다.
      -> 그래서 position value를 TextView에 표시되도록 설정하고 있다. [TexvView.setText() 이용]

  2) 주석 처리된 부분을 해제하면, 사용자가 Click(정확히는 Push)한 Image를 알 수 있다.
   * Hello, Gallery 예제에는 setOnItemClickListner 함수가 있음.
     => 그러나 내가 원한 것은 Press 할 때 클릭된 Image 정보가 아니다.
     => 요구사항은 Release할 때, 표시될 Image 정보이다.
      -> 그래서, 해당 소스를 주석처리하였다.
이상!!

허접한 글이지만, 도움이 되신다면 아래 손가락 꾹 눌러주세요.
Posted by 소혼
GalleryView는 작은 이미지를 화면에 출력하는데에는 적합할 수 있으나 화면을 채운 아이템들을 움직이는데는 부적합한 것 같다.

예를 들어 화면을 꽉 채운 GalleryView에 이미지가 5개 있고, 현재 1번 이미지를 보고 있다고 가정하자.
사용자가 화면에 flick을 통해 2번, 3번 이미지를 보고 싶을 수 있겠으나
GalleryView에서 flick을 발생하면 거의 바로 5번 이미지로 이동해버린다.
아주 천천히 스크롤하는 경우가 아니면 2,3번 이미지를 보긴 매우 어려운데

만약 flick할 때마다 한개의 이미지만을 넘기고 싶은 거라면, GalleryView로는 불가능 할 것 같다.

그래도 GalleryView를 짜기 버거워 어쩔수 없이 쓰던 GalleryView에 약간의 트릭을 해보았다.

일단 GalleryView를 상속 받고 onFling을 override한다.
onFling의 인자 가운데 새번째 인자인 velocityX의 값을 절반으로 나누어 부모 클래스의 onFling을 호출한다.

생각한 것만큼 좋은 효과를 보여주진 못하지만,
당장 써먹을 수 있는 수준인 것 같다.

궁극적으로는 GalleryView를 다시 짜야 할 것 같다 ;;

허접한 글이지만, 도움이 되셨다면 아래 손가락 꾹 눌러주세요.
Posted by 소혼
이전버튼 1 2 3 4 이전버튼

티스토리 툴바