[Android] ProgressBar Android 2011. 12. 21. 15:27

프로그레스는 진행 상태를 나타 내 준다.

안드로이드에서는 우리가 알고 있는 막대 형태의 프로그레스와 원형의 프로그레스 두가지가 있다.

막대 형태의 프로그레스를 쓰고 싶으면 style="?android:attr/ProgressBarStyleHorizontal" 처리를 하면 나타나고

원형을 하고 싶다면 XML에서 그 내용을 기입 할 필요가 없다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ProgressBar       
        android:id="@+id/prg1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="10"
        android:secondaryProgress="50"
    />
    <ProgressBar       
        android:id="@+id/prg2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
    />
    <Button
        android:id="@+id/defirst"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="defirst"
    />
    <Button
        android:id="@+id/infirst"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="infirst"
    />
    <Button
        android:id="@+id/desecond"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="desecond"
    />
    <Button
        android:id="@+id/insecond"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="insecond"
    />
   
    <Button
        android:id="@+id/start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="start"
    />
    <Button
        android:id="@+id/stop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="stop"
    />
</LinearLayout>

다음은 프로그레스바와 관련된 메서드에 대한 설명이다.

 메서드  설명 
 setProgress(int value)  프로그레스 값 설정
 setSecondaryProgress(int value)   두번째 프로그레스 값 설정
 incrementProgressBy(int value)  프로그레스 값 증가
 incrementSecondaryProgressBy(int value)   두번째 프로그레스 값 증가

여기서 첫번째 두번째 프로그레스라고 명시한 것은 동영상 버퍼링 중 재생 할 떄 뒷 색깔과 앞 색깔이 다른 것을 본 적이 있을 것이다. 그것을 말하는 것이다.

public class ImageViewActivity extends Activity{
 ProgressBar _prg1;
 ProgressBar _prg2;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        _prg1 = (ProgressBar)findViewById(R.id.prg1);
        _prg2 = (ProgressBar)findViewById(R.id.prg2);
       
        findViewById(R.id.defirst).setOnClickListener(listener);
        findViewById(R.id.infirst).setOnClickListener(listener);
        findViewById(R.id.desecond).setOnClickListener(listener);
        findViewById(R.id.insecond).setOnClickListener(listener);
        findViewById(R.id.start).setOnClickListener(listener);
        findViewById(R.id.stop).setOnClickListener(listener);
    }
 
 Button.OnClickListener listener = new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   switch(v.getId()){
   case R.id.defirst :
    _prg1.incrementProgressBy(-2);
    break;
   case R.id.infirst :
    _prg1.incrementProgressBy(2);
    break;
   case R.id.desecond:
    _prg1.incrementSecondaryProgressBy(-2);
    break;
   case R.id.insecond:
    _prg1.incrementSecondaryProgressBy(2);
    break;
   case R.id.start:
    _prg2.setVisibility(View.VISIBLE);
    break;
   case R.id.stop:
    _prg2.setVisibility(View.INVISIBLE);
    break;
   }
  }
 };
}
이 자바 코드를 넣고 실행을 해 보면 각기 메서드들에 대해서 확인이 가능 할 것이다.

단 원형 프로그레스는 값을 변경 하는 것이 아니라 대기 상황에 따라 보여주거나 사라지게 해야한다.

이러한 것은 쓰레드에서 이용하면 적합하다고 사료된다.

[Android] Gallery Android 2011. 12. 21. 14:38

캘러리는 수평으로 스크롤이 되는 어댑터 뷰로 중안에는 선택 항목으로 보이고 앞, 뒤 항목이 표시된다.

무난히 웹사이트에서 이미지 보이는 효과에서 많이들 봐 왔을 것이다.

xml에서 spacing 속성은 이미지간의 간격, animationDuration 은 이미지 스크롤 교체 시간을 이야기 한다.

xml 파일은 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gallery"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:spacing="5px"
    android:animationDuration="1500"
    />

자바 파일은 다음과 같다.

public class ImageViewActivity extends Activity{
 
     /** Called when the activity is first created. */
  @Override   
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
        
         Gallery g = (Gallery)findViewById(R.id.gallery);
         g.setAdapter(new ImageAdapter(this));
     }
}

class ImageAdapter extends BaseAdapter{
 Context _context;

 int[] _img = {R.drawable.calendar,R.drawable.ic_launcher};
 
 public ImageAdapter(Context context){
  _context = context;
 }
 
 public int getCount() {
  return _img.length;
 }

 public Object getItem(int position) {
  return _img[position];
 }

 public long getItemId(int position) {
  return position;
 }

 public View getView(int position, View convertView, ViewGroup parent) {
  ImageView view;
  if(convertView == null){
   view = new ImageView(_context);
  }
  else{
   view = (ImageView)convertView;
  }
  view.setImageResource(_img[position]);
  view.setScaleType(ImageView.ScaleType.FIT_XY);
  view.setLayoutParams(new Gallery.LayoutParams(45,45));
  return view;
 } 
}

여기에서 보면 LayoutParams 의 Width, Height 설정하는 부분의 사이즈는 이미지 사이즈를 말 하는 것이다.

이미지 파일을 만들어서 보여 줄 때 픽셀 단위로 확실하게 통일 해야 할 것이다. (필자 생각이다.)

[Android] GridView Android 2011. 12. 20. 18:11

이것은 2차원 표 형태로 출력하는 위젯이다.

그리드 뷰는 많이들 봐 왔을 것이다.

여기에는 문자열, 이미지 모두 가능하고 다수의 데이터 중 하나를 선택 받을 경우 적합하다.

xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    />

java

package imageview.test;

import android.app.Activity;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;
import android.content.*;

public class ImageViewActivity extends Activity{
 
     /** Called when the activity is first created. */
  @Override   
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
        
         GridView grid = (GridView)findViewById(R.id.grid);
         ImageAdapter adapter = new ImageAdapter(this);
         grid.setAdapter(adapter);
        
         grid.setOnItemClickListener(new OnItemClickListener(){
          public void onItemClick(AdapterView<?> parent, View view, int index, long id){
           Toast.makeText(ImageViewActivity.this, index+"선택", Toast.LENGTH_SHORT).show();
          }
         });
     }
}

class ImageAdapter extends BaseAdapter{
 Context _context;
 int[] picture = {R.drawable.calendar,R.drawable.calendar,R.drawable.calendar};
 public ImageAdapter(Context context){
  this._context=context;
 }
 
 public int getCount(){
  return 100;
 }
 
 public Object getItem(int index){
  return picture[index%3];
 }
 
 public long getItemId(int index){
  return index;
 }
 
 public View getView(int index, View view, ViewGroup parent){
  ImageView imgview;
  if(view==null){
   imgview = new ImageView(_context);
   imgview.setLayoutParams(new GridView.LayoutParams(45,45));
   imgview.setAdjustViewBounds(false);
   imgview.setScaleType(ImageView.ScaleType.CENTER_CROP);
   imgview.setPadding(8,8,8,8);
  }
  else{
   imgview = (ImageView)view;
  }
  imgview.setImageResource(picture[index % 3]);
  return imgview;
 }
}

실행을 해 보면 100개의 공간에 이미지가 들어가 있는 것을 확인 할 수가 있다.

[Android] Spinner Android 2011. 12. 20. 16:11
스피너는 선택하면 마치 팝업 처럼 나타난다.

리스트 같은 경우는 한번에 다 나타나는 케이스지만 이것은 클릭을 하면 팝업 형태로 주르륵 나타난다.

모바일 같이 협소한 공간에선 유용한 것이다.

xml

<TextView
        android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentLeft="true"
     android:id="@+id/text"
     android:text="select"
    />
    <Spinner
        android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:id="@+id/spinner"
    />  

java

ArrayAdapter<CharSequence> arr;
    /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        spinner.setPrompt("Select");
        arr = ArrayAdapter.createFromResource(this, R.array.array, android.R.layout.simple_spinner_item);
        arr.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(arr);
       
        spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
         public void onItemSelected(AdapterView<?> parent, View view, int index, long id){
          Toast.makeText(ImageViewActivity.this, arr.getItem(index), Toast.LENGTH_SHORT).show();
         }
         public void onNothingSelected(AdapterView<?> parent){
          
         }
        });
 }

실행을 하기 전에 하나 짚고 가자면 array xml을 꼭 생성하고 어댑터에 리소스를 연결 하는 것이 중요하다.

물론 사후 관리를 위해서이다.
[Android] AdapterView - 3 Android 2011. 12. 20. 15:34

커스텀 항목 뷰는 원하는 항목 배치에 좋다.

먼저 커스텀 레이아웃을 작성한다.

mail.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
   <TextView
        android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentLeft="true"
     android:id="@+id/text"
    />
    <Button
        android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/btn"
     android:text="test"
     android:layout_alignParentRight="true"
    />   
    <ListView
        android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/list"
    />
</RelativeLayout>

Item 클래스

public class Item {
 String _name;
 public Item(String name){
  this._name = name;
 }
}

Adapter 클래스

class ListAdapter extends BaseAdapter{
 Context _main;
 LayoutInflater _inflater;
 ArrayList<Item> _item;
 int _layout;
 
 public ListAdapter(Context context, int layout, ArrayList<Item> arr){
  this._main=context;
  this._inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  this._layout=layout;
  this._item=arr;
 }
 
 public int getCount(){
  return this._item.size();
 }
 
 public String getItem(int index){
  return this._item.get(index)._name;
 }
 
 public long getItemId(int index){
  return index;
 }
 
 public View getView(int index, View view, ViewGroup parent){
  final int idx = index;
  if(view==null){
   view = this._inflater.inflate(this._layout,parent,false);
  }
  TextView txtview = (TextView)view.findViewById(R.id.text);
  txtview.setText(this._item.get(idx)._name);
  
  Button btn = (Button)view.findViewById(R.id.btn);
  btn.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v){
    String str = _item.get(idx)._name;
    Toast.makeText(_main, str, Toast.LENGTH_SHORT).show();
   }
  });
  return view;
 }
}

메인 클래스

public class ImageViewActivity extends Activity{
 
 ArrayList<Item> arr;
 
 ListView list ;
    /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        arr = new ArrayList<Item>();
        Item item;
        item = new Item("first");
        arr.add(item);
        item = new Item("second");
        arr.add(item);
        item = new Item("third");
        arr.add(item);
       
        ListAdapter adapter = new ListAdapter(this,R.layout.main,arr);
        ListView list;
        list=(ListView)findViewById(R.id.list);
        list.setAdapter(adapter);
 }
}
실행을 하면 어댑터를 통하여 제어를 하는 것이 확인 가능하다.
 

[Android] AdapterView - 2 Android 2011. 12. 19. 15:25
리스트 뷰에서는 항목들을 각각이 편집이 가능하다.

다음은 리스트 뷰를 입력에 따라 추가 삭제 하는 내용이다.

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
    >
        <EditText
            android:id="@+id/text"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="4"    
        />
        <Button
            android:id="@+id/add"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="3"    
         android:text="add"
        />
        <Button
            android:id="@+id/del"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="3"
         android:text="delete"    
        />
    </LinearLayout>
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>

java 코드

ArrayList<String> arr;
 ArrayAdapter<String> adapter;
 ListView list ;
    /** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        arr = new ArrayList<String>();
        arr.add("first");
        arr.add("second");
        arr.add("third");
       
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr);       
       
        list = (ListView)findViewById(R.id.list);
        list.setAdapter(adapter);       
        list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        list.setDivider(new ColorDrawable(0xffffff00));
        list.setDividerHeight(2);
       
        list.setOnItemClickListener(i_listener);
        findViewById(R.id.add).setOnClickListener(b_listener);
        findViewById(R.id.del).setOnClickListener(b_listener);
    }
 
 AdapterView.OnItemClickListener i_listener = new AdapterView.OnItemClickListener() {
  public void onItemClick(AdapterView parent, View view, int position, long id){
   Toast.makeText(ImageViewActivity.this, "Select : " + arr.get(position), Toast.LENGTH_SHORT);
  } 
 };
 
 Button.OnClickListener b_listener = new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   EditText ed = (EditText)findViewById(R.id.text);
   switch(v.getId())
   {
    case R.id.add:
     String text = ed.getText().toString();
     if(text.length()!=0)
     {
      arr.add(text);
      ed.setText("");
      adapter.notifyDataSetChanged();
     }
     break;
    case R.id.del:
     int id = list.getCheckedItemPosition();
     if(id!=ListView.INVALID_POSITION)
     {
      arr.remove(id);
      list.clearChoices();
      adapter.notifyDataSetChanged();
     }
     break;
   }
  }
 };

여기에서 지금 SINGLE_CHOICE 로 된 것을 MULTIPLE_CHOICE 로 바꿔주면 한거번에 다수를 지울 수도 있다.

[Android] AdapterView - 1 Android 2011. 12. 19. 15:22
어댑터 뷰는 리스트 뷰, 그리드 뷰, 스피너, 갤러리 등 모은 것을 묶어서 어댑터 뷰라고 통칭한다.

이들은 여러개의 차일드 뷰를 가질 수도 있으며 터치나 키패드로 항목을 선택 할 수도 있다.

먼저 리스트 뷰를 보면 xml 파일을 다음과 같이 작성한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>
그리고 자바 파일은 다음과 같다.

/** Called when the activity is first created. */
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ArrayList<String> arr = new ArrayList<String>();
        arr.add("1");
        arr.add("2");
        arr.add("3");
        arr.add("4");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
        ListView list = (ListView)findViewById(R.id.list);
        list.setAdapter(adapter);
    }
행여 혹시나 ArrayList가 어떤 것을 import 해야할지 모르는 사람들을 위해 한마디. java.util 을 import 하면 된다.

여기에서 보면 먼저 데이터를 형성하고 그 다음 어댑터를 준비, 다음으로 연결 했다. 어댑터의 속성은 다음과 같다.

첫번째 인자는 현재 액티비티. 그 다음은 리소스 아이디, 마지막으로 생성된 데이터다. 마지막 인자는 배열 형태로도 넣을 수 있다.

리소스 아이디를 살펴보면 다음과 같다.

 리소스 아이디 설명 
 simple_list_item_1 하나의 텍스트 뷰
 simple_list_item_2 두개의 텍스트 뷰
 simple_list_item_check 오른쪽에 체크 표시
 simple_list_item_single_choice 오른쪽에 라디오 버튼 표시
 simple_list_item_multiple_choice 오른쪽에 체크 버튼 표시

하지만 이런 형식으로 데이터를 입력 하는 것보다 리소스에 정의 해서 쓰는 것이 좋다.

리소스 파일을 생성해서 10개의 데이터를 넣어보자.

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name ="array">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
    </string-array>
</resources>

java 파일에서는 어댑터를 다음과 같이 써 주면 된다.

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.array,android.R.layout.simple_list_item_1);

리스트 뷰에는 다음과 같은 속성들이 존재한다.

 속성  인자   설명 
 none  CHOICE_MODE_NONE  항목 선택 못함
 singleChoice  CHOICE_MODE_SINGLE  하나의 항목 선택
 multipleChoice  CHOICE_MODE__MULTIPLE  복수의 항목 선택

java 코드에서 다음과 같은 코드를 추가하고 실행해보면 변화를 알 수가 있을 것이다.

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
list.setDivider(new ColorDrawable(0xffffff00));
list.setDividerHeight(2);
[Android] TextView Android 2011. 12. 19. 10:11
텍스트 뷰는 버튼과 에디트 텍스트의 상위 계층이다.

버튼과 에디트 텍스트는 이를 상속받아서 그 기능을 쓰기 때문에 거의 동일한 속성들을 이용 할 수 있다.

각 속성에서 보면 에디트 텍스트에는 scrollHorizontally 라는 속성이 있다. 이것은 문자열이 가로 스크롤을 넘어 입력을 받더라도 문자열을 계속 입력 할 수 있고 엔터 키를 누르면 강제로 개행이 바뀐다. 하지만 singleLine 속성을 주면 개행이 되지 않는다.

Hint는 배경에 이 컴포넌트가 어떤 동작을 하는 것인지 예시를 적어 줄 수도 있게 되어 있다. 마치 백그라운드 처럼 나타난다.

또한 selectAllOnFocus 속성을 지정하면 문자열 전체를 선택하면서 캐럿은 맨 마지막에 위치 한다.

cursorVisible은 편집 중인 문자열의 위치를 보이거나 숨겨준다.

autoLink는 | 를 통하여 여러가지 링크를 같이 한다. 그 종류는 다음과 같다.

none - 링크 지원하지 않음
email - 이메일 주소
map - 지도 주소
web - 웹 주소
phone - 전화번호
all - 모든 패턴 인식

Editable 을 이용하면 문자열 편집이 가능하다.

Editable insert(int index, CharSequence text) 경우는 어디 위치에 text를 삽입하라
Editable delete(int index, int endIndex) 경우는 어디 위치에서 endIndex까지 문자열을 삭제하라
Editable append(char text) 경우는 맨 마지막에 text를 붙여라
void clear() 경우는 문자열 clear
Editable replace(int startIndex, int endIndex, CharSequence text) 경우는 어디 위치에서 어디 위치까지 문자열 변경하라

TextWatcher 를 이용하면 입력되는 문자의 변경을 감지 할 수 있다.

단 android.text.*; 을 import 시켜야 한다.

다음은 그 예제 이다.

TextView view;
 EditText edit;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        view = (TextView)findViewById(R.id.view);
        edit = (EditText)findViewById(R.id.edit);
        edit.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});
        edit.addTextChangedListener(watcher);
    }
 
 TextWatcher watcher = new TextWatcher(){
  public void afterTextChanged(Editable s){
   
  }
  public void beforeTextChanged(CharSequence s, int start, int count, int after){
   
  }
  public void onTextChanged(CharSequence s, int start, int before, int count){
   view.setText("echo : " + s);
  }
 };

위에서 보면 after, before, on 으로 변경 후, 변경 전, 변경 중 상태에 대한 이벤트라는 것을 알 수가 있다.

또한 setFilters를 이용하여 입력하는 문자열의 길이를 제한 시킬 수도 있다.
[Android] 대체 Resource Android 2011. 12. 16. 14:43

대체 리소스란 그 환경이 변함에 따라 대체 한다는 의미이다.

예를 들어 화면을 회전 하였을 경우 거기에 맞게 변화하게 된다.

여기에서 기본 적으로 가로 형태를 돌렸을 경우 -land 폴더를 찾아가고 -port 경우는 세로이다.

-port 가 없을 경우에는 layout 폴더를 참조를 한다.

먼저 res/layout-land 폴더를 만들고 layout 내의 xml과 동일한 내용을 적용을 시켜보자 코드는 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    >
    <Button
        android:layout_width="100px"
        android:layout_height="wrap_content"
        android:text="1번"
        />
    <Button
        android:layout_width="100px"
        android:layout_height="wrap_content"
        android:text="2번"
        />
</LinearLayout>

이 코드를 실행하여 에뮬레이터에서 Ctrl + F11 을 누르면 화면의 방향이 변하는데 이를 실행함서 그 내용을 확인 할 수 있다.

[Android] Style&Theme Android 2011. 12. 16. 14:28
위젯들은 알다 시피 View에서 파생되어 모든 것을 이용한다.

여기서 스타일은 뷰, 테마는 액티비티 단위에 적용되고, 스타일은 문단 스타일, 테마는 데스크탑 테마와 개념상 일치한다.

스타일은 상속을 이용하여 사용 할 수가 있다. 그럴 경우 parent라는 키워드가 붙지만, 그렇지 않을 경우 name만 이용하면 된다.

다음은 그 예이다.

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name = "style1">
        <item name = "android:textColor">#fff000</item>
        <item name = "android:textSize">15pt</item>
    </style>
    <style name = "style2" parent ="@style/style1">
        <item name = "android:textColor">#ff0000</item>
    </style>
</resources>

main.xml

<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        style = "@style/style1"
    />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        style ="@style/style2"
    />
실행을 해 보면 처음의 것은 노란색 글자가 나오고 15pt로 정의 된 글자가 나올 것이다.

두번째는 색상은 재정의 했으나 size는 상속받은 내용 대로 15pt로 동일하게 출력이 되는 것을 확인 할 수 있다.

테마의 경우를 살펴보면 styles.xml에 하나만 추가를 해 주면 된다.

<style name="theme">
        <item name = "android:windowNoTitle">true</item>
</style>

그리고 메니페스트 속성에 테마를 지정을 해 준다.

android:theme="@style/theme"

이 부분을 activity 부분에 추가를 해 주면 된다.

그렇게 하면 윈도우 타이틀이 없어짐을 확인 할 수 있으며, android:theme="@android:style/Theme.Dialog" 처리를 할 경우 대화상자 처럼 나타 날 것이다.