크기에사용할수있는단위 표기 단위 설명 px 픽셀수 사용중화면에서의픽셀수, 해상도가높아지면픽셀의물리적인크기가줄어든다. in 인치 사용중화면에서의인치단위의길이 mm 밀리미터 사용중화면에서의밀리미터단위의길이 pt 포인트수 사용중화면에서의 1/72 인치를 1 포인트로하는길이 dp 해상도에의존하지않는픽셀수 1은해상도가 180dpi일때 1 픽셀. 10dp가 160dpi일때에는 10픽셀, 320dpi일때에는 20픽셀이된다. sp 폰트사이즈를고려한픽셀수 사용자가설정하고있는폰트사이즈를고려한스케일된픽셀수. 실제의픽셀수는사용중인화면의해상도와폰트사이즈에의해달라진다. dpi(dot per inch) 의약자로 1인치 (2.54cm) 당들어가는점의수를말한다. 이값이클수록같은공간안에더많 은점이있어서더욱선명하다. 즉, 150dpi 보다 300dpi 가더욱선명하다. 안드로이드위젯 (widget) : android.widget 패키지에존재 위젯이름 ( 클래스이름 ) TextView EditText AutoCompleteTextView ImageView VideoView Button CompoundButton CheckBox RadioButton RadioGroup ImageButton DatePicker TimePicker 설명읽기전용의문자열출력용편집이가능한문자열입력상자사용자의입력에맞추어서미리정의된문자열을보여주는 TextView 아이콘이나사진등의이미지를표시동영상을재상버튼체크와해제의두가지상태를갖는버튼체크와해제의두가지상태를갖는체크박스체크와해제의두가지상태를갖는라디오버튼여러개의라디오버튼중하나만을체크상태로하는버튼그룹이미지를표시할수있는버튼년월일을달력에서선택시간을선택 - 1 -
뷰그룹 ( 레이아웃 ) 레이아웃이름 ( 클래스이름 ) FrameLayout LinearLayout 설명단일객체를표현하기위한프레임. 왼쪽상단에하나의뷰를배치하기때문에나중 에그린객체만보여준다. 수평또는수직으로자손의뷰를배치. 뷰가들어갈만한공간이없을때는자동으로 스크롤바가나타난다. TableLayout 행과열을기즌표형태로나타나며가장큰요소의크기로셀을설정하며셀테두리는은닉된다. AbsoluteLayout 프로그래머가뷰의위치를좌표값으로지정한다. RelativeLayout 부모의뷰나자손의뷰끼리의상대적인위치를지정한다. Gallery 이미지를수평으로스크롤하여보여준다. GridView 격자모양 ( 눈금구조 ) 으로보여준다. ListView 스크롤되는하나의컬럼리스트를보여준다. ScrollView 수직으로구성요소의열을스크롤하게한다. Spinner 콤보박스역할을한다. SurfaceView Low level로그리기를지원한다. TabHost 탭으로액티비티를전환하도록탭선택목록을지원한다. ViewFlipper 슬라이드쇼처럼시간주기로아이템을변경한다. - 2 -
다양한버튼만들기 - 3 -
화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:layout_height="wrap_content" android:text=" 다양한버튼살피기 "/> <LinearLayout android:id="@+id/linearlayout01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/checkbox" android:text=" 체크박스 "></CheckBox> </LinearLayout> <LinearLayout android:id="@+id/linearlayout02" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textview01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 선택한것 : 없슴 "></TextView> <RadioGroup android:id="@+id/radiogroup01" android:layout_width="wrap_content" android:layout_height="wrap_content"> <RadioButton android:id="@+id/radiobutton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 라디오버튼 1"></RadioButton> <RadioButton android:id="@+id/radiobutton02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 라디오버튼 2"></RadioButton> <RadioButton android:id="@+id/radiobutton03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 라디오버튼 3"></RadioButton> <RadioButton android:id="@+id/radiobutton04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 라디오버튼 4"></RadioButton> </RadioGroup> </LinearLayout> <LinearLayout android:id="@+id/linearlayout03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <ToggleButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/toggle_button" android:text=" 토글 " android:textoff=" 해제상태 " android:texton=" 선택상태 "></ToggleButton> <TextView android:layout_height="wrap_content" android:text=" 클릭해보세요." android:gravity="center_vertical" android:id="@+id/text_feature"></textview> - 4 -
</LinearLayout> <LinearLayout android:id="@+id/linearlayout04" android:orientation="vertical" android:gravity="center" android:layout_height="fill_parent"> <Button android:id="@+id/button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 종료버튼 "></Button> </LinearLayout> <LinearLayout android:id="@+id/linearlayout05" android:layout_height="fill_parent" android:gravity="bottom"> <Button android:id="@+id/button02" android:layout_height="wrap_content" android:text="submit" android:gravity="center" ></Button> </LinearLayout> </LinearLayout> - 5 -
자바클래스 public class UIDemo2 extends Activity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // 화면디자인에서설계한버튼을불러온다. 왜? 버튼을클릭할때발생하는이벤트를처리하기위해서. final CheckBox check_button = (CheckBox)findViewById(R.id.checkbox); // 참고내부클래스나익명클래스에서사용하는외부의변수는 ( 여기서는 check_button) 반드시 final // 로선언되어야한다. check_button.setonclicklistener(new View.OnClickListener() {// 익명클래스를이용한이벤트처리 ); public void onclick(view v) {// 버튼클릭이벤트처리 TextView tv = (TextView)findViewById(R.id.checkbox); tv.settext(check_button.ischecked()? " 체크상태 " : " 체크해제 "); final RadioGroup group = (RadioGroup)findViewById(R.id.RadioGroup01); group.setoncheckedchangelistener(new RadioGroup.OnCheckedChangeListener() { public void oncheckedchanged(radiogroup group, int checkedid) { TextView tv = (TextView)findViewById(R.id.TextView01); if(checkedid!= -1) { RadioButton rb = (RadioButton)findViewById(checkedId); if(rb!= null) tv.settext(" 선택한것 :" + rb.gettext()); else { tv.settext(" 없슴 "); ); - 6 -
final Button clear_choice = (Button)findViewById(R.id.Button01); clear_choice.setonclicklistener(new View.OnClickListener() { ); public void onclick(view v) { RadioGroup group = (RadioGroup)findViewById(R.id.RadioGroup01); if(group!= null) group.clearcheck(); final ToggleButton toggle_button = (ToggleButton)findViewById(R.id.toggle_button); toggle_button.setonclicklistener(new View.OnClickListener() { ); public void onclick(view v) { TextView tv = (TextView)findViewById(R.id.text_feature); tv.settext(toggle_button.ischecked()? " 온상태 " : " 오프상태 "); - 7 -
키이벤트처리 키에관련된이벤트는사용자가아이템을포커스를하여장치에있는키를누르거나놓을때발생한다. 키가눌렸을 때에는 onkeydown() 메소드가, 키를놓았을때에는 onkeyup() 메소드가호출된다. onkeyup() 과 onkeydown() 메소드는 View.OnKeyListener 에서사용된다. 키이벤트처리예제 사용자가화면을조작하면조작할때발생하는이벤트의정보가로그를통해서출력된다. DDMS 를통해서로그정보를 확인하도록한다. - 8 -
화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 롱클릭처리 "></Button> <EditText android:id="@+id/edittext01" android:layout_height="wrap_content" android:text=" 포커스처리 "></EditText> <EditText android:id="@+id/edittext02" android:layout_height="wrap_content" ></EditText> </LinearLayout> - 9 -
자바클래스 public class EventDemo extends Activity { private static final String DebugTAG = "EventDemoActivity";//DDMS 의로그출력에사용할로그의이름 public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); Button button = (Button)findViewById(R.id.Button01);// 화면설계에사용된버튼을불러온다. button.setonlongclicklistener(new View.OnLongClickListener() { public boolean onlongclick(view v) { Log.i(DebugTAG, "onlongclick"); return true; ); TextView focustext = (TextView)findViewById(R.id.EditText01);// 화면설계에사용된텍스트뷰를불러옴 focustext.setonfocuschangelistener(new View.OnFocusChangeListener() { String msavetext = ""; public void onfocuschange(view v, boolean hasfocus) { if(hasfocus) { if(msavetext!= null) ((TextView)v).setText(mSaveText); else { msavetext = ((TextView)v).getText().toString(); ((TextView)v).setText(""); ); //The end of oncreate() public boolean onkeydown(int keycode, KeyEvent event) { Log.d(DebugTAG, "onkeydowm = " + keycode); return super.onkeydown(keycode, event); public boolean onkeyup(int keycode, KeyEvent event) { Log.d(DebugTAG, "onkeyup = " + keycode); return super.onkeyup(keycode, event); - 10 -
ArrayAdapter 안드로이드에서는배열의내용을위젯에출력하기위해서 ArrayAdapter 를사용한다. 사용예 ) private String[] items = {" 항목 1", " 항목 2", " 항목 3"; ArrayAdapter<String> adapter = new ArrayDapter<String>(this, android.r.layout.simple_list_item_1, items); this : 어댑터가포함되어있는인스턴스지정 android.r.layout.simple_list_item_1 : 안드로이드시스템에서제공하는위젯의이름. 즉, 사용자가생성해서사용하는위젯이아니라시스템자체에서사용하는위젯의이름. 배열의값을안드로이드내부에서사용하는리스트에저장한다. items : 화면에출력할실제내용이들어있는배열의이름 사용자가생성한위젯은 R 클래스에서찾을수있으며, 시스템에서생성한위젯은 android.r 클래스에서찾는다. - 11 -
ListView 안드로이드에서리스트박스를구현할때사용하는위젯이다. ListView 는배열, 리스트, 데이터베이스내의여러가지 데이터항목들을출력하는데사용한다. 화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:layout_height="wrap_content" android:text="@string/hello" /> <ListView android:id="@+id/listview01" android:layout_height="wrap_content" ></ListView> </LinearLayout> - 12 -
자바클래스 public class ListViewDemo2 extends Activity { private String[] items = {" 항목 1", " 항목 2", " 항목 3";// 화면에출력할항목들 public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.r.layout.simple_expandable_list_item_1, items); // 배열을출력하기위해서 ArrayAdapter 를생성한다. ListView lv = (ListView)findViewById(R.id.ListView01); lv.setadapter(adapter);// 리스트뷰에서사용하는어댑터를 ArrayAdapter로설정한다. lv.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { Toast.makeText(ListViewDemo2.this, "Clicked_id=" + arg3, Toast.LENGTH_SHORT).show(); // 리스트에서선택한내용이토스트에출력된다. ); - 13 -
Spinner 콤보박스와같이드롭다운선택기능을구현하기위하여안드로이드에서제공하는위젯이다. - 14 -
화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_height="wrap_content" /> <Spinner android:id="@+id/spinner" android:layout_height="wrap_content" android:drawselectorontop="true" ></Spinner> </LinearLayout> - 15 -
자바클래스 public class SpinnerDemo extends Activity implements AdapterView.OnItemSelectedListener{ TextView selection; String[] items = {"Lorem", "ipsum", "dolor", "sit", "amet", "consectituer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "sodales", "pellentesque", "augue", "purus" ;// 메뉴에사용할이름들. public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); selection = (TextView)findViewById(R.id.selection); Spinner spin = (Spinner)findViewById(R.id.spinner); spin.setonitemselectedlistener(this); ArrayAdapter aa = new ArrayAdapter(this, android.r.layout.simple_spinner_item, items); aa.setdropdownviewresource(android.r.layout.simple_spinner_dropdown_item); spin.setadapter(aa); public void onitemselected(adapterview parent, View v, int position, long id) { selection.settext(items[position]); public void onnothingselected(adapterview parent) { selection.settext(""); - 16 -
자동완성기능구현하기문자열의일부만입력해도입력한문자로시작되는단어나입력한문자가포함된단어들을쭉나열해보여준다. AutoCompleteTextView클래스를사용해서이기능을구현한다. 이클래스는 EditView 클래스를상속한클래스로 EditView의속성을그대로사용할수있다. AutoCompleteTextView 클래스의 android:completionthreashold 속성은사용자가자동완성드롭다운목록이표시되는지를설정한다. 또한, android:layout_height의속성값은 "wrap_content" 로설정해야드롭다운목록이보인다. AutoCompleteTextView는 TextWatcher 리스너를통해서입력되는텍스트가변경될때마다이벤트를받아와서처리할수있다. 화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent"> <TextView android:id="@+id/country" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="country" /> <AutoCompleteTextView android:id="@+id/edit" android:layout_height="wrap_content" android:completionthreshold="1"/> </LinearLayout> - 17 -
자바클래스 public class AutoCompleteDemo extends Activity implements TextWatcher{ TextView country; AutoCompleteTextView edit; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); country = (TextView) findviewbyid(r.id.country); edit = (AutoCompleteTextView) findviewbyid(r.id.edit); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.r.layout.simple_dropdown_item_1line, COUNTRIES); //android.r.layout.simple_dropdown_item_1line은안드로이드시스템이자체적으로사용하는 // 드롭다운위젯의이름이다. COUNTRIES는출력될내용이저장된배열의이름이다. edit.setadapter(adapter); edit.addtextchangedlistener(this);//autocompletetextview 위젯에리스너를붙인다. public void ontextchanged(charsequence s, int start, int before, int count) { country.settext(edit.gettext());// 입력이발생하면 TextView 에입력된내용을출력한다. //TextWatcher 리스너가가지고있는메소드 public void aftertextchanged(editable s) { //TextWatcher 리스너가가지고있는메소드 public void beforetextchanged(charsequence s, int start, int count, int after) { //TextWatcher 리스너가가지고있는메소드 static final String[] COUNTRIES = new String[] { "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil";// 알파벳 A와 B로시작하는국가이름 - 18 -
Handler 안드로이드에서스레드에게메시지를전송하는방법은 Handler 클래스를상속받는방법이다. 액티비티별로하나만만들면충분하고, 별도의작업은필요없다. Handler 인스턴스를생성하기만하면안드로이드스레드시스템에자동으로등록된다. 핸들러인스턴스와통신하는방법으로는메시지를이용한방법이있다. 핸들러인스턴스에메시지를전달하려면 obtainmessage() 메소드를호출해서 Message 인스턴스를확보해서 sendmessage() 를사용하거나빈메시지를 setndemptymessage() 메소드로보낸다. 핸들러를사용하는방법... Handler handler = new Handler() { public void handlemessage(message msg) { // 핸들러에메시지를전송하면수행할작업 ;// 익명클래스를만드는방법을사용해서핸들러클래스를만들었다.... Thread background = new Thread(new Runnable() {//Runnable 인터페이스를상속해서무명클래스를생성함 public void run() { try { Thread.sleep(1000);//1초동안대기 handler.sendmessage(handler.obtainmessage()); // 핸들러객체로부터메시지객체를얻어오자마자이메시지객체를핸들러로전송한다. // 그러면, 위의 handlemessage() 메소드에기술된작업이처리된다. catch(exception t) { ); // 예외처리 - 19 -
HandlerDemo 실행결과 - 20 -
화면설계 (main.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <ProgressBar android:layout_height="wrap_content" android:id="@+id/progress" style="?android:attr/progressbarstylehorizontal" > </ProgressBar> </LinearLayout> - 21 -
자바클래스 public class HandlerDemo extends Activity { ProgressBar bar; Handler handler=new Handler() { public void handlemessage(message msg) {// 핸들러객체로메세지가전송되면실행된다. bar.incrementprogressby(5); ; boolean isrunning=false; public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); bar=(progressbar)findviewbyid(r.id.progress); public void onstart() { super.onstart(); bar.setprogress(0);// 상태바의상태를 0으로초기화한다. Thread background=new Thread(new Runnable() { public void run() { try { for (int i=0;i<20 && isrunning;i++) { Thread.sleep(1000);//1초동안대기 handler.sendmessage(handler.obtainmessage()); // 핸들러객체로메세지를전송한다. catch (Throwable t) { // just end the background thread ); isrunning=true; background.start();// 스레드를실행한다. public void onstop() { super.onstop(); isrunning=false; - 22 -