EditText 내에 쓰여지는 스트링 구문을 오른쪽, 중앙, 왼쪽 정렬을 하고 싶으시면 아래와 같이 하면됩니다.

On xml layout
android:gravity="right" 

On code
EditText content = new EditText(this);
...
content.setGravity(Gravity.RIGHT);
...

별탈없이 잘될겁니다.
Posted by 빈솔B
,
가상 키보드를 강제로 보이게 하고 또 안보이게 하는 방법입니다.

InputMethodManager imm;

@Override
public void onCreate(Bundle icicle) {
TimerTask myTask = new TimerTask(){
public void run(){
imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); imm.showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED);
}
};
Timer timer = new Timer();
timer.schedule(myTask, 500);


@Override
protected void onPause() {
super.onPause(); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

위의 액티비티가 포어그라운드로 실행될 때 InputMethodService 의 참조를 얻어서 가상 키패드를 보여주는 메소드를 차례로 호출하고 있습니다. 그리고 위 액티비티가 백그라운드로 실행되면 onPouse를 내에 가상 키패드를 감추는 메소드를 호출하게 되어있습니다.

어려운 것은 없지만 왜 타이머 안에 구현되어 있느냐가 중요합니다.
 기본적으로 키보드는 OS 단에서 지원되는 것이기때문에 아무곳에나 붙이기는 어렵습니다. 그리고 액티비티 생성시 바로 호출하게되면 뜨지 않습니다.(제 생각엔, 아마 내부적으로 onCreate 작업의 막바지거나 끝나고 수행되는듯 합니다.) 그래서 타이머나 핸들러로 약간의 딜레이 주는 작업이 불가피합니다.


Posted by 빈솔B
,
Layout Xml로 구현한 Layout 속성 (width, height, weight, marginLeft, marginRight)이 있습니다.

<EditText android:id="@+id/saved"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/something"
    android:layout_marginLeft="10sp"
    android:layout_marginRight="10sp"
    android:layout_weight="1"
    android:background="@drawable/green"
    android:text="@string/initial_text"
    android:freezesText="true">
    <requestFocus />
</EditText>

위의 Layout Xml로 구현한 Layout 속성을 동적 코드로 만들면 아래와 같습니다.

EditText content = new EditText(getBaseContext());
MarginLayoutParams marginCotent = new ViewGroup.MarginLayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT );
marginCotent.setMargins( 1, 1, 0, 0 );
content.setLayoutParams( new LinearLayout.LayoutParams( marginCotent ) );
content.setBackgroundColor(Color.LTGRAY);
content.setGravity(Gravity.LEFT);
content.setFreezesText(true);
content.requestFocus();

마진 수치가 완전히 일치하진 않습니다. 유의하기 바랍니다.
눈여겨 볼게 하나 있는데 requestFocus 되어 있으면 해당 텍스트에디터에 자동 포커싱되게 됩니다.

Posted by 빈솔B
,
사용자가 만든 컬러 코드는 왜 안먹히고 안드로이드 내장 라이브러리 컬러 코드는 먹히는가?

사용자가 만든 컬러코드 res/values/color.xml 내부 코드 입니다.
<resources>  
<color name="solid_red">#f00</color>
<color name="solid_blue">#0000ff</color>
<color name="solid_green">#f0f0</color>
<color name="solid_yellow">#ffffff00</color>
</resources>

아래와 같이 xml 레이아웃 통한 설정은 잘 동작합니다.
<LinearLayout 
...
android:background="#ffffffff"
...
/>

하지만 아래와 같이 동적생성일 경우엔 오브젝트 생성후 속성 세팅으로는 이상하게 커스텀 컬러 코드로는 동작하지 않습니다. 안드로이드 내장 라이브러리 컬러 코드로 해야 적용이 제대로 됩니다.
LinearLayout info = new LinearLayout(this);

//customer Resource.Color
info.setBackgroundColor(R.color.solid_yellow);

//Android.graphics.Color
info.setBackgroundColor(Color.WHITE);

왜이럴까;; 원래 이런건가;;
언젠가 알날이 오것지.. 씁쓸하구만.. 아깝다 내 두시간..
Posted by 빈솔B
,
WebView  

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

먼저 WebView를 보면 웹페이지를 나타내기 위한 뷰라고 설명하고 있습니다. 자신이 만든 액티비티에서 웹 컨텐츠를 보여주며 웹페이지 렌터링 엔진과 브라우저 기능도 포함한 WebKit을 사용한다고 되어있습니다.

이 액티비티를 사용하기 위해서는 Manifest 파일에 아래에 있는 설정파일을 넣어주어야 합니다.
<uses-permission android:name="android.permission.INTERNET" />

기본 사용법 역시 xml layer 로 구현 또는 소스로 구현이 가능합니다.
xml
<WebView android:id="@+id/webview"
  android:layout_height="wrap_content"
  android:layout_width="fill_parent" />

code 
WebView browser = (WebView)findViewById(R.id.webview);  
browser.loadUrl("http://m.daum.net/mini"); 
또는
only code
WebView webview = new WebView(this);
setContentView(webview);
webview.loadUrl("http://m.daum.net/mini");

더 자세한 내용은 레퍼런스를 참조하시기 바랍니다.

* 주의 할점 : WebView로 구현시에는 첫 화면 로딩시에는 액티비티 내로 브라우저 내용이 보이지만 그 이후 페이지 내에 링크를 통해 리로딩될시에는 내장된 브라우저가 실행 되어 버립니다. 만약 현재 액티비티 안에서만 계속 리로딩하고 싶으면 아래에 언급될 WebViewClient를 사용하도록 합니다.
 

WebViewClient

WebView의 하위클래스로서 내용, 예시, 에러, 폼등록의 렌더링 할때 호출된다. url 가로채기(intercept) 역시 이걸 통해 할수 있습니다.
WebView browser = (WebView)findViewById(R.id.webview);          browser.setWebViewClient(new WebViewClient() {

  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url)  { 
     view.loadUrl(url); 
     return true;
 }
});
browser.loadUrl("http://m.daum.net/mini/"); 

더 자세한 내용은 아래 주소를 참고하시기 바랍니다.
http://developer.android.com/reference/android/webkit/WebViewClient.html





Posted by 빈솔B
,
안드로이드 데이터 베이스에 질의 하기입니다.

Cursor android.database.sqlite.SQLiteDatabase.query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

Since: API Level 1

Query the given URL, returning a Cursor over the result set.

Parameters
distinct true if you want each row to be unique, false otherwise.
결과 셋이 유일한 값만 가져야 되는지 여부 결정하는 선택적 boolean 값
table The table name to compile the query against.
질의할 테이블 이름.
columns A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used.
결과 셋에 포함될 열들이 나열될 스트링 배열.
selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.
"WHERE" 구문이라 생각하면 될듯. 와일드 카드"?"가 포함될 수 있다.
selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.
"WHERE" 구문에 있었던 와일드 카드 "?"를 대체할 선택 인자 문자열 배열.
groupBy A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped.
그룹바이 구문.
having A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used.
그룹바이 시 해빙구문
orderBy How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.
순서 제어.
limit Limits the number of rows returned by the query, formatted as LIMIT clause. Passing null denotes no LIMIT clause.
리턴되는 행 갯수 제한 LIMIT 
* 제일 앞에 distinct 및 limit 는 선택적 옵션이고 나머지는 필수이다. 
Returns
  • A Cursor object, which is positioned before the first entry
See Also

Posted by 빈솔B
,
안드로이드 데이터베이스 설계시 고려사항

- 파일(비트맵,오디오)은 대게 DB에 저장하지 않고, 해당 파일 경로를 저장하되 정규화된 컨텐츠 공급자 URI를 되도록 사용 하도록 합니다.
- 모든 테이블에 auto-increase key 필드를 되도록 사용권장한다. 만약 컨텐츠 공급자를 이용할 계획이라면 반드시 unique id를 사용하도록 합니다.

- SQLite 데이터베이스 열은 느슨한 타입법을 사용하기 때문에 개별 값을 필요에 따라 유효한 타입으로 캐스팅 가능합니다.
Posted by 빈솔B
,
* SQLiteOpenHelper 클래스 확장해서 사용시 onUpdate 할 때 기존 테이블을 버리고 새로 만드는 것보단 기존 데이터를 새 테이블로 옮기는 편이 좋습니다.

* getWriteableDatabase는 디스크 공간이나 권한 문제로 인해 오류가 날 수 있습니다. 그래서 방어코드 일환으로 getReadableDatabase 메서드가 대신 호출 되게 하는 것이 좋습니다.

SQLiteDatabase db;
try {
db = dbHelper.getWritableDatabase();
} catch {
db = dbHelper.getReadableDatabase();
}
 

Posted by 빈솔B
,
AndroidManifest.xml 에서 아래와 같이 수정하거나  
<activity android:name=".ActivityName" 
android:label="Activity Label" 
android:theme="@android:style/Theme.NoTitleBar">
</activity>

소스 단에서
requestWindowFeature(Window.FEATURE_NO_TITLE);
해줘도 됩니다. 하지만 주의 할 점은 AndroidManifest.xml 에 타이틀 안쓰게 세팅해 놓고 소스단에서는 타이틀 바를 사용할려면 런타임오류가 납니다.


나만의 타이틀 바(Custom Title Bar)를 만들어 보기입니다.

* 소스로 구현하기
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.bloglist);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.bloglist_title);
TextView leftTitle = (TextView) findViewById(R.id.left_text);
title.setText("My Blog List");
TextView rightTitle = (TextView) findViewById(R.id.right_text);
rightTitle.setText("daum");

* UI로 구현하기
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/screen"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <!-- TextView android:id="@+id/left_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"/>
    <TextView android:id="@+id/right_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"/> -->
<ImageView
android:id="@+id/title"
android:src="@drawable/title_tistory"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />      
</RelativeLayout>




Posted by 빈솔B
,


안드로이드 시스템 이미지를 Flashing(적절한 용어가 생각이 잘..;;)하기 위한 두 가지 방법이 있습니다.

1. 업데이트 복구 이미지를 이용해 기기를 Flashing하는 방법
이 방법은 Android SDK에 있는 adb tool 을 사용하며 업데트된 radio 및 복구 이미지를 기기의 SD card 의 복구 파티션에 복사하는 방법입니다. 이것은 윈도우, 맥OS, 리눅스에서 직접적으로 할 수 있는 방법이며 만약 안드로이드 개발자라면 이 방법을 추천한다고 하네요. 이 방법을 사용하기 위해 기기는 반드시 orginal factory bootloader(hboot 0.95.3000)를 가지고 있어야 합니다.

2. fastboot 명령어를 통한 기기를 Flashing하는 방법
이 방법은 조금 더 복잡하다고 하네요. 기기에 flashing하기 위해 adb tool과 업데이트 radio image와 fastboot tool 을 가지고 한는데, 만약 독립적으로 radio 및 시스템 이미지를 설치할 필요가 있거나 fastboot 에 좀 더 능숙하다면 이 방법이 더 유용할 수 있다고 합니다. 이 방법을 쓰기 위해서는 기기는 fastboot-compatible bootloader를 반드시 가지고 있어야 하며 original factory bootloader 는 필요는 없습니다.

두 가지 방법의 큰 차이점은 recovery-image 방법은 fastboot tool이 필요없다는 것이며 fastboot 사용하는 방법 대신에 당신은 updated recovery image를 복사하는데 adb를 사용한다는 것이라고 합니다. 나머지 단계는 동일하네요.

지금 서술되는 방법들은 지원되는 기기 타입은 아래 두가지로 제한되어 있습니다.
- HTC Dream hardware platform only!!!
- Device must have the original factory bootloader (hboot 0.95.3000) or a development bootloader that supports fastboot

다른 하드웨어 플랫폼이나 original factory bootloader가 없는 HTC Dream 하드에어 버전, bootloader 가 fastboot를 지원하지 않을 경우 flashing할 수 없다고 합니다. 게다가 T-mobile G1같은 상용 기기도 불가능한데 그 이유가 적절한 암호 서명(crytographic signatures)을 가지고 있지 않기 때문이라고 하네요.

Get the Tools
- recovery-image 방법으로 할려면 adb tool 필요하며 Android SDK 최신버전을 받으면 됩니다.
- fastboot 방법으로 할려면 fastboot 툴과 adb tool 이 필요합니다.
- 두 가지 방법 다 윈도우 환경에서는 USB 드라이버 업데이트 해야 합니다.

Adb Tool
최신 Andorid SDK 받으면 <sdk>/tools/ directory. 여기에 있습니다.
최신 SDK는 여기서 받으면 됩니다.
http://developer.android.com/sdk/index.html

Fastboot Tool
fastboot 방법 사용하려면, fastboot 명령어툴이 필요합니다.
fastboot source 코드는 Android open source repository 에 있고 그 tree로 부터 빌드한 어느 곳이든 컴파일 된다. 만약 open source tree로 부터 빌드했다면 이 위치에 찾을 수 있을 것이라고 하는데 해 보진 않았습니다;
<build-dir>/out/host/<platform>/bin/
편리한대로 다운로드 받으시면 됩니다. (링크 참조)
맥OS라든지 리눅스에서는 어디든 받아서 사용해도 되지만, 윈도우 경우 꼭 AdbWinApi.dll 파일이 있는 Android SDK tool 디렉토리에 넣어서 사용하도록 합니다. 아니면 동작 안할 수도 있다고 하네요.

USB Driver
윈도우일 경우엔 USB 드라이버를 꼭 최신버전으로 업데이트 합니다. 더 많은 정보를 얻으려면
http://developer.android.com/guide/developing/device.html#setting-up 참조합니다.

Download the Image Package
- recovery-image 방법 사용할 경우엔 recovery-image package와 radio image package 만 받습니다.
- fastboot method 경우엔 system image package 와 radio image package 만 받습니다.

Radio Image Download
두 가지 방법 다 이걸 필요로 합니다. 각각의 버전은 radio firmware 특정 버전 상에서만 실행될 수 있게 설계 되었으며, 일반적으로 각각의 버전은 radio firmware의 새로운 버전에 의존합니다. 그래서 기기에 새로운 system image를 flash 할때마다 update 또는 downgrade 해야 한다고 하네요. 플랫폼에 의해 요구되는 버전으로 radio firmware를 업데이트 해야 하며, 만약 radio image를 업데이트 안하면 문제가 생길 수 있다.

일단 radio image package를 받으면 압축을 풀필요는 없습니다. 그냥 adb 명령어를 통해 알아서 참조됩니다. 그래서 어디든 저장해도 상관은 없지만 파일 유지 보수 관리를 위해 네이밍은 신경써서 하라고 하네요

System Image Download
fastboot 방법 쓸려면 요걸 받아야 하는데요 다양한 버전이 있으므로 필요한 버전이 어떤지 이해하고 어떤 버전을 받을 것인지 확실히 하라고 합낟. 개발을 위해서는 어플이 엊힐 수 있는 가장 낮은 버전의 플랫폼을 선택하라고 하네요. 예를 들어 sdk1.1를 사용하고 어플은 1.1 api를 사용했다면, 1.1시스템 이미지를 다운로드 받아야 하구요, 만약 1.1 sdk 사용하는데 1.1 api를 사용하지 않은 어플이라면 1.0 이미지면 충분하다고 하네요.

테스트를 위해 해당 어플이 호환성이 있는지 모든 플랫폼 버전을 다운받아서 잘 실행되는지를 고려하라고 하네요.

각각의 system image 패키지는 zip 압축이며 내부에 여러 파일이 들어있네요
boot image : 커널과 initrd(초기화설정파일?)이 포함
recovery image : 시스템 rebuilding/updating 사용되는 파일 포함
systrem image : 특정 버전의 안드로이드 platform/apps 를 포함

각각의 이미지는 상호 독립적이며 함께 있어야 flash 가능합니다. 예를 들어 같은 image package안에 boot 나 recovery image 없이 system image만으로는 flash가 불가능 합니다.   

일단 system image 패키지 받은 다음 압축을 풀 필요는 없으며 fastboot로 부터 바로 참조 됩니다. 어느 곳에 받아도 상관없으며 radio image처럼 유지보수관리를 위해 네이밍만 신경쓰라고 하네요

Recovery Image Download
recovery-image 방법 사용경우 사용하는데 씁니다.

Currently, a recovery image packages is available only for the Android 1.1 platform version. 이런 문구가 있는데;; 이상하네요. 1.0만 없지 1.1~1.6까지는 다 있는데 말이죠;; 문서 업데이트를 잘 안하나 봅니다;

압축된 패키지 내용은 다음과 같네요
boot image
recovery image
system image
radio image : 호환성 있는 radio firmware를 포함

각각의 recovery 패키지는 서로 상호 독립적이며 같이 있어야 하며 다운로드 받으면 압축필요없고.. 블라블라.. 위에 system image내용과 이 후 내용은 동일하네요;

Update the Devide Radio Firmware
자 이제 Radio 업데이트 시작입니다. recovery-image든 fastboot 방법이든 system 업데이트 전에 radio firmware를 해야 하는데요 이 단계는 호환성 있는 radio image 가 기기에 있는지, 업데이트된 recovery image가 로딩될때 bootloader에 의해 강제 필수조건인 버전 안정한지를 검사합니다.

tool 설치되었구 필요한 image 파일을 받았으면 아래와 같이 수행합니다.
1. SD card를 기기에 넣습니다.
2. 부팅 시킵니다.
3. USB로 개발 기기를 연결합니다.
4. 명령어 창에서 장치가 인식되었는지 검사합니다.

C:\eclipse_galileo\plugins\android-sdk-windows-1.6_r1\tools>adb devices
List of devices attached
HT99ELZ00496    device

5. adb push 명령어를 이용해 radio image를 sdcard 디렉토리에 update.zip 파일 이름으로 복사합니다.

C:\eclipse_galileo\plugins\android-sdk-windows-1.6_r1\tools>adb push ota-radio-2
_22_19_26I.zip /sdcard/update.zip
1068 KB/s (9181622 bytes in 8.390s)

* 5번 수행에서 주의 사항은 kb표시로 복사가 완료된 것처럼 보이지만 실제로 백그라운드에서는 복사가 수행되고 있을 수도 있습니다. 그래서 1~2분 정도 충분히 기다리신후 다음 단계로 넘어갑니다 안그러면 혹시 나중에 업데이트시 "bad update.zip"이 발생할 수도 있습니다.
끝났다고 판단되면 아래 sync 명령으로 확인해 봅니다.

C:\eclipse_galileo\plugins\android-sdk-windows-1.6_r1\tools>adb shell sync

C:\eclipse_galileo\plugins\android-sdk-windows-1.6_r1\tools>

adb shell sync 실행하면 장치로 복사된 모든 데이터 리스트 들이 보인다는데; 이상하게 아무것도 안나와서 직접 adb shell 로 sdcard를 접근해서 리스트에는 있는 걸 확인후 계속 진행했지요.

C:\eclipse_galileo\plugins\android-sdk-windows-1.6_r1\tools>adb shell
$ su
su
# ls
ls
sqlite_stmt_journals
cache
sdcard
etc
init
logo.rle
init.trout.rc
init.goldfish.rc
init.rc
default.prop
system
data
sys
proc
sbin
root
dev
# cd sdcard
cd sdcard
# ls
ls
dcim
doom
update.zip



6. 그런다음 장치를 끕니다 다시 켜기 전에 Home키를 꾸욱 누른채로 END키 눌려 장치를 켭니다. 그러면 느낌표의 아이콘이 보입니다. 이 화면의 복구모드 화면입니다.
7. 복구모드 화면에서 키패드를 열고 ALT+l(L)를 누르면 복구 콘솔에 로그들이 보입니다.
8. 다음으로 ALT+s를 누르면 update 설치가 되며 installing update 아이콘 상태와 진행 상태바가 보입니다.
9. 완료되면 Home+Back키를 눌릅니다 그러면 몇초동안 "updating firmware" 아이콘이 보이면서 firmware를 업데이트 합니다. 그리고 자동 리부팅됩니다.

이제 system image나 recovery image를 업데이트 할수 있는 상태가됩니다.
radio image 버전 체크를 하기 위해서는 fastboot mode로 부팅하면 됩니다. fastboot 부팅 방법은 BACK 홀딩한 채로 END를 누릅니다. 나가고 싶으면 MENU+SEND+END 키를 누릅니다. 데브폰 경우에는 SEND를 call키, END를 End Call키라고 부른다고 하네요 

참고로 제 데브폰 상태는

DREA100 PVT 32B
HBOOT-0.95.3000
CPLD-4
RADIO-2.22.19.261
Oct 20 2008

이네요 잘 업데이트 된 걸 확인했습니다 ^^

Copy the Recovery Image Package to the Device
fastboot 방법으로 하고 있다면 이 단계를 필요없습니다. 다음의 Flash the System Image Package to the Device단계를 수행하면 됩니다.)

1. 일단 recovery image를 SD카드에 복사합니다.
2. 장치를 켭니다.
3. USB로 장치 연결합니다.
4. adb devices로 잘 연결 되었는지 장치 확인 후 recovery 파일을 sd디렉토리에 update.zip으로 복사합니다.

이런.. 위 단계 radio image 업데이트 단계와 동일하군요; 그럼 더 이상 기술은 하지 않고 실행 결과만 보겠습니다. 단 조금 다른점은 이전 보다 로그 정보가 많다는 겁니다. file deleting 도 많이 보이네요.

Flash the System Image Package to the Device
이 단계는 나중에 한번 시도 해봐야겠네요; 시간 날때 정리하겠습니다; 너무 졸려서요;

Troubleshooting
한 번에 수행이 잘 끝나서;(나만 괜찮으면 돼! 심리가 갑자기 발동하네요;; 이런거 싫은데;;ㅎㅎ) 원문 글 참조해서 봐주셨으면 하네요; 이 것 역시 시간날때 간단히 정리합지요 ^^;

자.. 1.6 설치가 잘 끝났습니다. 1.5와 거의 비슷한데 UI조금 바뀐게 있고 이것저것 기능 추가 된것도 간간히 보이네요~ 2.0 이미지 나오면 그 때 또 후기 올릴께요.
즐거운 안드로이드 개발 하세요~

참조 원문: http://developer.htc.com/adp.html


Posted by 빈솔B
,