Android Handler 와 CountDownTimer 사용 예

== Handler
1. 임의의 시간에 무엇을 처리하고 싶을 때
2. 일정한 주기를 반복적으로 수행할 때
3. 시계 또는 타이머 또는 애니메이션, 백그라운드 감시 작업
4. 주간에 멈춤 가능
간단 방법)
Handler h = new Handler(){
public void handleMessage(Message m){
//기능
h.sendEmptyMessageDelayed(메시지, 초);
}
};
h.sendEmptyMessage(0);

== CountDownTimer(인터페이스)
1. 주기적인 작업처리 할 때 사용
2. 중간에 멈추게 할 수 있음
간단 방법)
CountDownTimer cdt = new CountDownTimer(long l, logn l2){ // l : 총시간 , l2 : 카운트 주기
public void onTick(long m){
//주기적인으로 실행할 기능
}
public void onFinish(){
//끝날때 기능
}
}.start();

== 사용 예 ==

1. Handler

public class HandlerEx extends Activity{
TextView tv = null;
ProgressBar pb = null;
ProgressBar pb2 = null;

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.handler_ex);

tv = (TextView)findViewById(R.id.text);
pb = (ProgressBar)findViewById(R.id.pb);
pb.setBackGroundColor(Color.BLUE);

pb2 = (ProgressBar)findViewById(R.id.pb2);

//빈페이지 보내기
h.sendEmptyMessage(0);
}

//Handler 객체 생서
Handler h = new Handler(){
int i = 1;

public void handleMessage(Message m){
pb.incrementProgressBar(10);
tv.setText(i * 10) + “%”);

if( i <= 10 ){
//1초 지연 시간을 두어 자신에게 다시 메시지를 보낸다.
h.sendEmptyMessageDelayed(0, 1000);
} else {
tv.setText(“완료”);
}

i ++;
}
};
}

2. CountDownTimer

public class CountDownTimerEx extends Activity{
TextView tv = null;
ProgressBar pb = null;
ProgressBar pb2 = null;

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.cdt_ex);

tv = (TextView)findViewById(R.id.text);
pb = (ProgressBar)findViewById(R.id.pb);
pb.setBackGroundColor(Color.BLUE);

pb2 = (ProgressBar)findViewById(R.id.pb2);

//CountDownTimer 를 이용한 방법
new CountDownTimer(1000 * 10, 1000){
int i = 1;

public void onTick(long m){
incrementBy();
}
public void onFinish(){
incrementBy();
tv.setText(“완료”);
}

public void incrementBy(){
tv.setText( i * 10 + “%”);
pb.incrementProgressBy(10);

i++;
}
}.start();
}
}

Android 설정 저장 프레프런스

프레프런스(Preference)란?
어플리케이션의 설정 정보를 영구적으로 XML파일로 저장하여 관리하는 도구다.
안드로이드에선 자체적으로 설정사항을 관리하는 XML과 클래스들을 가지고 있다.

1. 프레프런스 가져오기
프레프런스를 사용하려면 먼저 프레프런스 관련 파일을 가져와야 한다.

SharedPreferences getSharedPreferences(String name, int mode)
첫번째 인수 – 프레프런스를 저장할 XML파일의 이름
두번째 인수 – 읽기, 쓰기 관련 모드 지정
???? (? 0 : 읽기, 쓰기 가능? )
???? ( MODE_WORLD_READABLE :? 읽기 공유 )
???? ( MODE_WORDL_WRITEABLE : 쓰기 공유 )

프레프런스 읽기
int getInt (String key, int defValue)
String getString?(String key, int defValue)
boolean getBoolean?(String key, int defValue)
Float getFloat?(String key, int defValue)
Long getLong?(String key, int defValue)

key : 데이터의 이름을 지정
defValue : default 값을 설정

기본 타입으로 모든 메소드가 오버로딩 되어 있다.

2. 프레프런스 기록
프레프런스 에디터 가져오기
기록을 하는 경우에는 또 가져와야 하는 것이 있다.
먼저 읽기와 동일하게 프레프런스를 가져온 이후에 에디터를 가져와야 한다.
에디터는 프레프런스 클래스의 이너 클래스인 SharedPreferences.Editor가 제공한다.

Editor는 변경 사항을 모두 모아두었다가 한꺼번에 적용시키는 기능을 가지고 있다.

SharedPreferences 프레프런스 객체 = getSharedPreferences(“PreTest”, 0);
SharedPreferences.Editor 에디터 객체 = 프레프런스 객체.edit();

프레프런스 기록
SharedPreferences.Editor putInt(String key, int value)
SharedPreferences.Editor putBoolean(String key,?boolean value)
SharedPreferences.Editor putString (String key,?String value)
SharedPreferences.Editor putFloat(String key,?Float value)
SharedPreferences.Editor putLong(String key,?Long value)

해당 키 값 삭제
SharedPreferences.Editor remove(String key)

boolean commit()
put* 메소드들로 데이터를 넣었으면 commit를 실행 시켜야만 프레프런스로 저장이 된다.

Android 텍스트에 자동링크 속성 부여하기

autoLink 속성은 문자열에 포함된 링크를 자동으로

해석하여 링크로 표시하고 클릭 이벤트를 처리한다.

“|” 연산자로 묶어 여러가지 링크를 같이 지정할 수도 있다.

none : 링크를 지원하지 않는다.
email : 이메일 주소를 인식
map : 지도의 주소를 인식
web : 웹 주소를 인식
phone : 전화번호를 인식
all : 위의 모든 패턴을 인식

android:autoLink=”all”? 다음과 같이 사용하면 된다.

Android EditText를 이용한 비밀번호 입력 – PasswordTransformationMethod

안드로이드에서?PasswordTransformationMethod를 생성하여 간단하게

EditText에 입력되는 값을 비밀번호 입력같이 * 표시로 바꿀수 있다.

간단히 setTransformationMethod()를 호출해주면 된다.

EditText edit = (EditText)view.findVIewById(R.id.edit_box);
//숫자 키패드 설정
edit.setInputType(InputType.TYPE_CLASS_NUMBER);
//password format 변경
PasswordTransformationMehod passwdfm = new PasswordTransformationMethod();
edit.setTransformationMethod(passwdfm);

Android GPS 두 점 사이 거리 구하는 방법

float [] distance = new float[2];???????
float result;???????????? //실제 거리를 담을 변수

Location.distanceBetween(lat1, lon1, lat2, lon2, distance);
//lat1, lon1은 첫번째 사용자, lat2, lon2는 두번째 사용자의 gps값
//distanceBetween은 Location클래스 내에서 정의된 static함수이기 때문에
//Location클래스를 통해 어디서든 호출할 수 있다.
//이 함수가 호출되고 나면 distance 배열의 첫번째 요수로 두지점의 거리가 할당된다.

result = distance[0];??? //두 점의 거리

Android GPS 사용하기

먼저 gps 를 사용하기 위해서는 Manifest 에
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”></uses-permission>
을 추가 해야 한다.

<소스 코드>
LocationManager locM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

String provider = LocationManager.GPS_PROVIDER; //GPS_PROVIER로 설정

Location loc = locM.getLastKnownLocation(provider); //마지막으로 기억하는 위치를 설정한다.

//주소를 확인하기 위한 Geocoder KOREA와 KOREAN 둘다 가능
Geocoder geocoder = new Geocoder(this, Locale.KOREAN);
//GPS를 10초(1000 * 10) 마다 또는 10미터 이동시마다 위치값을 받아온다.
?locM.requestLocationUpdates(provider, 10000, 10, locListener);

//위 locListener? 변수의 final로 선언해 따로 빼낸 형태
private final LocationListener locListener = new LocationListener(){
?? @Override
?? public void onStatusChanged(String provider, int status, Bundle extras){
?? //GPS 상태 변화가 있을때 할 일
?? }

? @Override
???public void onProviderEnabled(String provider) {
? ? //?GPS?사용가능으로 바꼇을 때 할 일
?? ?}

?? @Override
?? public void onProviderDisabled(String provider) {
?? //GPS사용 불가능으로 바꼇을 때 할 일
?? }
??
?? @Override
?? public void onLocationChanged(Location location) {
?? // 바뀐 위치를 수신하였을 때 할 일
?? }
?};

Android ProgressBar & SeekBar 진행상황표시하기


일부 작업의 진행 상황을 시각적으로 표시하는 ProgressBar. 작업이 얼마나 진행이 되었는지 사용자에게 bar형태로 보여줍니다. 응용 프로그램은 진행의 양을 앞으로ㅗ 움직이면서 (bar의 길이를 수정하면서) 변경할 수 있습니다. progressbar 안에 progressbar가 스트리밍 재생 진행률을 표시하는 동안 버퍼 단계의 진행률을 보여주는 것 같은 경우의 2차 진행 상황도 있습니다.

?progressbar는 쉽게 가늠할 수 없게 만들 수도 있습니다. 불확정 모드에서 progressbar는 주기적 애니메이션(wheel)을 보여준다. 작업의 길이를 알 수 없는 경우 사용된다.

=== progressbar 예제 ===

public class TestProgressBar extends Activity {
?? private ProgressBar progressbar;
?? private int progressStatus = 0;????????????????? //progressbar 상태
?? private int progressSecondaryStatus?= 0;??? //secondary progressbar 상태
?? private Handler handler = new Handler();

?? @Override
?? public void onCreate(Bundle savedInstanceState){
????? super.onCreate(savedInstanceState);
????? setContentView(R.layout.main);

????? progressbar = (ProgressBar)findViewById(R.id.progress_bar);

????? new Thread(new Runnable(){
???????? public void run() {
??????????? // progressbar 상태 max 값은 100이다.
??????????? while( progressStatus <= 100){
?????????????? if(progressSecondaryStatus <= 100 )
????????????????? progressSecondaryStatus = buffering();
???????????????progressStatus = working();

?????????????? handler.post(new Runnable(){
????????????????? public void run(){
???????????????????? progressBar.setProgress(progressStatus);
???????????????????? progressBar.setSecondaryProgress(progressSecondaryStatus );
????????????????? }
?????????????? });
??????????? }
???????????//100 초 초과시 사라진다.
??????????? handler.post(new Runnable(){
?????????????? public void run(){
????????????????? progressBar.setVisibility(VIew.GONE);
?????????????? }
??????????? });
??????? } //end run()

??????? private int buffering(){
?????????? try{
????????????? Thread.sleep(500);
?????????? } catch(InterruptedException e){
?????????????? e.printStackTrace();
???????????}
?????????? return progressSecondaryStatus += 2;
??????? }? //end buffering()

??????? private int working(){
?????????? try{
????????????? Thread.sleep(500);
?????????? } catch(InterruptedException e){
????????????? e.printStackTrace();
?????????? }
?????????? retrun ++progressStatus;
????????} //end working()
???? }).start();
?? }? //end onCreate
}

Android에 대화상자 만들기

android에 대화상자 넣기!!!

== 버튼 한개 대화상자(내용확인할때) ==
AlertDialog.Builder builder = new AlertDialog.Builder(context);

builder.setTitle(“대화상자제목”)
?? .setCancelable(true)
?? .setMessage(“대화상자내용”)
?? .setNegativeButtono(“확인”, new DialogInterface.OnClickListener(){
????? public void onClick(DialogInterface dialog, int which){
???????? //확인 눌렀을때 실행 내용
???????? //확인하고 끝나고 싶다면 .setNegativeButton(“확인”,null) 사용하면 됨
????? }
}).show();

== 버튼 두개 대화상자(예 or 아니요) ==

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(“대화상자제목”)
?? .setCancelable(true)
?? .setMessage(“대화상자내용”)
?? .setPositiveButton(“예”, new DialogInterface.OnClickListener(){
????? public void onClick(DialogInterface dialog, int which){
???????? //눌렀을때 실행할 내용
????? }
?? })
?? .setNegativeButton(“아니요”,null)
?? //.setNegativeButton(“아니요”, new DialogInterface.OnClickListener(){
???//?? public void onClick(DialogInterface dialog, int which){
?? //????? //눌렀을때 실행할 내용
???//?? }
?? //})
.show();

예제?사이트 :http://arabiannight.tistory.com/tag/android%20alertdialog

android SQLite 데이터 베이스 사용하기

안드로이드는 DB를 관리하는 SQLiteOpenHelper 라는 도우미 클래스를 제공하는데 이름 그대로 DB를 생성 및 오픈하는 처리를 담당한다.

생성자 :
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

도우미 객체를 생성해 놓으면 DB가 필요한 시점에 다음 3개의 메소드를 호출
1. onCreate
DB 가 처음 만들어질 때 호출된다. 여기서 테이블을 만들고 초기 레코드를 삽입힌다.
2. onUpgrade
DB를 업그레이드할 때 호출된다. 기존 테이블을 삭제하고 새로만들거나 ALTER TABLE로 스키마를 수정한다.
3. onOpen
DB를 열 때 호출된다.

사용 예

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class SQLite_Text extends Activity{
?? TestHelper myHelper;
?? TextView mText;
?? EditText col1;
?? EditText col2;

?? public void onCreate(Bundle savedInstanceState){
????? super.onCreate(savedInstanceState);
????? setContentView(R.layout.main);

????? myHelper = new TestHelper(this);
????? mText = (TextView)findViewById(R.id.tv);
????? col1 = (EditText)findViewById(R.id.et1);
????? col2 = (EditText)findViewById(R.id.et2);
?? }

?? public void mOnClick(View v){
????? SQLiteDatabase db;
????? ContentValues row;
????? switch(v.getId()){
??????case R.id.insert:
???????? db = myHelper.getWritableDatabase();

???????? row = new ContentValues();
???????? row.put(“col1″, col1.getText().toString());
???????? row.put(“col2″, col2.getText().toString());
???????? db.insert(“tbl_sample”, null, row);

???????? myHelper.close();
???????? mText.setText(“Insert Success”);
???????? break;

????? case R.id.delete:
???????? db = myHelper.getWritableDatabase();
???????? db.execSQL(“DELETE FROM tbl_sample where col1=”+col1.getText().toString()+”;”);
???????? myHelper.close();
???????? mText.setText(“Delete Success”);
???????? break;

????? case R.id.update:
???????? db = myHelper.getWritableDatabase();

???????? row = new ContentValues();
???????? row.put(“col2″, col2.getText().toString());
???????? db.update(“tbl_sample”, row, “col1 = ” + col1.getText().toString()+”",null);

???????? myHelper.close();
???????? mText.setText(“Update Success”);
?????????break;

????? case R.id.select:
?????????db = myHelper.getReadableDatabase();
???????? Cursor cursor;
????????? cursor = db.rawQuery(“SELECT col1, col2 FROM tbl_sample”,null);

????????? String result = “”;
????????? while(cursor.moveToNext()){
???????????? String col1 = cursor.getString(0);
???????????? String col2 = cursro.getString(1);
?????????????result += (col1+”=”+col2+”\n”);
?????????? }

?????????? if(result.length() == 0){
????????????? mText.setText(“Empt Set”);
?????????? }
?????????? else{
??????????????mText.setText(result);
?????????? }

?????????? cursor.close();
?????????? myHelper.close();
?????????? break;
?????? }
???}
}

class TestHelper extends SQLiteOpenHelper{
?? public TestHelper(Context context){
????? super(context, “Text.db”, null, 1);
?? }

?? public void onCreate(SQLiteDatabase db){
????? db.execSQL(“CREATE TABLE tbl_sample ” +?
????????????? “(row_id INTEGER PRIMARY KEY AUTOINCREMENT;” +
????????????? “col1 TEXT, col2 TEXT);”);
?? }

?? public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
????? db.execSQL(“DROP TABLE IF EXISTS tbl_sample”);
????? onCreate(db);
?? }
}