[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" 처리를 할 경우 대화상자 처럼 나타 날 것이다.
[Android] Resource Android 2011. 12. 16. 14:03
리소스는 동작과는 직접적인 상관이 없고 외형 장식을 정의한다.

문자열, 이미지, 사운드 등이 그 예이다.

리소스 타입은 이클립스 왼편의 res 아래에 있는 내용들이다. 물론 추가를 하여 이용 할 수도 있다.

리소스 명칭은 복수형을 의미하는 s가 접미로 붙고 모두 소문자여야만 한다.

문자열은 strings, 색상은 colors, 스타일과 테마는 styles, 배열은 arrays, 크기 정보들은 dimens 에 정의 된다.

실제 예를 들어

strings에 문자열 하나, dimes에 크기 정보 하나를 넣어 두고 다음과 같은 코드를 실행 해 보면 그 결과를 확인 할 수 있다.

<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:textSize="@dimen/size"
    />
[Android] ContextMenu Android 2011. 12. 16. 11:52
컨텍스트 메뉴는 뷰를 누르고 있으면 뜨는 화면이다. 예를들자면.. Select All 등과 같은 그런 화면을 본 적이 있을 것이다.

Copy, Paste 등과 같은..

이것은 최초 registerForContextMenu(View view)를 통해 등록 한 후

onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ConTextMenuInfo info) 를 통하여
그 화면 구성을 나타낸다.

물론 선택 내용에 대해서는 onContextItemSelected(MenuItem item) 을 통해서 그 이벤트를 정의 한다.

다음은 그 예제 코드이다.

main.xml

<Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff0000"       
        android:text="Button"
        android:textSize="20px"
        />
    <EditText
        android:id="@+id/edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="edit"
        />

java

/** Called when the activity is first created. */
 Button btn;
 EditText edit;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.btn);
        edit = (EditText)findViewById(R.id.edit);
       
        registerForContextMenu(btn);
        registerForContextMenu(edit);
    }
 
 @Override 
 public void onCreateContextMenu(ContextMenu menu,View view, ContextMenu.ContextMenuInfo info){
  super.onCreateContextMenu(menu,view,info);
  
  if(view==btn){
   menu.setHeaderTitle("Button menu");
   menu.add(0,1,0,"Red");
   menu.add(0,2,0,"Green");
   menu.add(0,3,0,"Blue");
  }
  else if(view==edit){
   menu.add(0,4,0,"텍스트1");
   menu.add(0,5,0,"텍스트2");
  }
 }
 
 @Override 
 public boolean onContextItemSelected(MenuItem item){
  switch(item.getItemId()){
  case 1:
   btn.setTextColor(Color.RED);
   return true;
  case 2:
   btn.setTextColor(Color.BLUE);
   return true;
  case 3:
   btn.setTextColor(Color.GREEN);
   return true;
  case 4:
   Toast.makeText(this, "1번", Toast.LENGTH_SHORT).show();
   return true;
  case 5:
   Toast.makeText(this, "2번", Toast.LENGTH_SHORT).show();
   return true;
  }
  return false;
 }

다음을 실행 해 보면 버튼을 누르고 있을 떄와 에디트텍스트를 누르고 있을 때 서로 다른 점을 확인 할 수가 있을 것이다.
[Android] CheckMenu Android 2011. 12. 16. 11:19
체크 메뉴는 체크 박스 통한 선택이나 라디오 버튼을 통한 선택적인 메뉴를 나타 낼 수 있다.

라디오 박스의 경우 group을 통하여 서로 꼭 묵어주는 것을 잊으면 안된다.

또한 이 메뉴는 컨텍스트 메뉴와 서브 메뉴에서만 사용이 가능하다.

다음은 그 예시 코드 이다.

main.xml

<Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ff0000"       
        android:text="Button"
        android:textSize="20px"
        />

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@+id/submenu"
       android:title="SubMenu">
       <menu>
           <group
               android:id="@+id/checkble_group"
              android:checkableBehavior="all">
              <item
               android:id="@+id/bigfont"
               android:title="BigFont"
               />
           </group>
           <group
               android:id="@+id/exclusive_checkable_group"
               android:checkableBehavior="single">
              <item android:id="@+id/red"
                    android:title="RED"
                    android:checked="true"/>
              <item android:id="@+id/green"
                    android:title="GREEN"
                    android:checked="true"/>
              <item android:id="@+id/blue"
                    android:title="BLUE"
                    android:checked="true"/>
          </group>   
       </menu>   
 </item>
</menu>

java

Button btn;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.btn);
    }
 
 @Override 
 public boolean onCreateOptionsMenu(Menu menu){
  super.onCreateOptionsMenu(menu);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.menu,menu);
  return true;
 }
 
 @Override
 public boolean onPrepareOptionsMenu(Menu menu){
  if(btn.getTextSize()==40){
   menu.findItem(R.id.bigfont).setChecked(true);
  }
  else{
   menu.findItem(R.id.bigfont).setChecked(false);
  }
  
  int color = btn.getTextColors().getDefaultColor();
  
  if(color==Color.RED){
   menu.findItem(R.id.red).setChecked(true);
  }
  else if(color==Color.GREEN){
   menu.findItem(R.id.green).setChecked(true); 
  }
  else if(color==Color.BLUE){
   menu.findItem(R.id.blue).setChecked(true);
  }
  return true;
 }
 @Override 
 public boolean onOptionsItemSelected(MenuItem item){
  switch(item.getItemId()){
  case R.id.bigfont:
   if(item.isCheckable()){
    btn.setTextSize(20);
   }
   else{
    btn.setTextSize(40);
   }
   return true;
  case R.id.red:
   btn.setTextColor(Color.RED);
   return true;
  case R.id.blue:
   btn.setTextColor(Color.BLUE);
   return true;
  case R.id.green:
   btn.setTextColor(Color.GREEN);
   return true;
  }
  return false;
 }

이 코드를 실행하면 서브 메뉴 선택에 따라서 버튼에 대한 상태가 바뀜을 확인 할 수 있다.