[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;
 }

이 코드를 실행하면 서브 메뉴 선택에 따라서 버튼에 대한 상태가 바뀜을 확인 할 수 있다.
[Android] OptionMenu Android 2011. 12. 15. 18:08
옵션 메뉴는 폰에서 메뉴 버튼을 눌렀을 때 하단에 나타나는 메뉴이다.

총 6개 까지만 적용이 가능하고 공간이 넘어 갈 경우 MORE를 통해서 넘겨 볼 수 있다.

옵션 메뉴 외에 컨텍스트 메뉴가 있는데 이것은 일정 시간 누르면 화면 중안에 나타나고, 서브 메뉴는 메뉴 항목을 가지는 일종의 팝업으로 화면 한 가운데 나타난다.

다음은 간단한 옵션 메뉴의 예이다.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        TextView text = new TextView(this);
        text.setText("Click Menu");
        setContentView(text);
    }
 
 @Override 
 public boolean onCreateOptionsMenu(Menu menu){
  super.onCreateOptionsMenu(menu);
  MenuItem item = menu.add(0,1,0,"1번");
  //item.setIcon(R.drawable.calendar);
  item.setAlphabeticShortcut('a');
  menu.add(0,2,0,"2번");
  //item.setIcon(R.drawable.calendar);
  SubMenu sub = menu.addSubMenu("etc");
  sub.add(0,3,0,"1번");
  sub.add(0,4,0,"2번");
  return true;
 }
 
 @Override 
 public boolean onOptionsItemSelected(MenuItem item){
  switch(item.getItemId()){
  case 1:
   Toast.makeText(this, "1", Toast.LENGTH_SHORT).show();
   return true;   
  case 2:
   Toast.makeText(this, "2", Toast.LENGTH_SHORT).show();
   return true;
  case 3:
   Toast.makeText(this, "3", Toast.LENGTH_SHORT).show();
   return true;
  case 4:
   Toast.makeText(this, "4", Toast.LENGTH_SHORT).show();
   return true;
  }
  return false;
 }

add(0,1,0,"1번") 에서 보면 처음의 인자는 그룹 아이디, 다음은 아이템 아이디, 다음은 메뉴의 순서를 말하는 것인데 0으로 두면 순차적으로 붙는다. 마지막은 캡션 문자열을 말한다.

또한 onCreateOptionsMenu 메서드는 최초 한번만 실행 되는 것이다.

다음은 XML로 구성한 경우를 살펴 보자.

먼저 res 폴더 아래에 menu 폴더를 생성하고 그곳에 menu.xml 파일을 생성한 후 다음과 같은 코드를 넣는다.

<item android:id="@+id/one"       
       android:title="1번"
    />
    <item android:id="@+id/two"       
       android:title="2번"
    />
    <item android:id="@+id/three"       
       android:title="etc">
       <menu>
       <item android:id="@+id/four"       
        android:title="3번"
       />
       <item android:id="@+id/five"       
        android:title="4번"
       />      
       </menu>
    </item>

다음으로 java 파일이다.

@Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        TextView text = new TextView(this);
        text.setText("Click Menu");
        setContentView(text);
    }
 
 @Override 
 public boolean onCreateOptionsMenu(Menu menu){
  super.onCreateOptionsMenu(menu);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.menu,menu);
  return true;
 }
 
 @Override 
 public boolean onOptionsItemSelected(MenuItem item){
  switch(item.getItemId()){
  case R.id.one:
   Toast.makeText(this, "1", Toast.LENGTH_SHORT).show();
   return true;   
  case R.id.two:
   Toast.makeText(this, "2", Toast.LENGTH_SHORT).show();
   return true;
  case R.id.four:
   Toast.makeText(this, "3", Toast.LENGTH_SHORT).show();
   return true;
  case R.id.five:
   Toast.makeText(this, "4", Toast.LENGTH_SHORT).show();
   return true;
  }
  return false;
 }

이렇게 넣어주고 실행 해 보면 이전과 동일한 결과를 얻음을 확인 할 수 있을 것이다.
[Android] Timer Event Android 2011. 12. 15. 16:33

타이머는 각 시간에 따라 처리 하는 쓰레드이다.

사용 방법은 두가지가 있는데 먼저 핸들러를 이용한 것은 다음과 같은 코드이다.

public class ImageViewActivity extends Activity{
 
    /** Called when the activity is first created. */
 int time_count = 0;
 TextView text;
 Handler handler;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.main);
        text = (TextView)findViewById(R.id.text);
       
        handler = new Handler(){
      public void handleMessage(Message msg){
       time_count++;
       text.setText("Value" + time_count);
       handler.sendEmptyMessageDelayed(0,1000);
      }
     };
        handler.sendEmptyMessage(0);
    }
}
이렇게 하면 카운트가 바뀌는 것을 확인 가능하다. 여담으로 하는 말이지만 setText에 int형 값만 넘길 경우에는 에뮬레이터에서 에러를 나타낸다.

다음은 CountDownTimer를 이용하는 방법이다.

public class ImageViewActivity extends Activity{
 
    /** Called when the activity is first created. */
 int time_count = 0;
 TextView text;
 CountDownTimer timer;
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.main);
        text = (TextView)findViewById(R.id.text);
       
        timer = new CountDownTimer(10 * 1000,1000){
         public void onTick(long millisec){
          time_count++;
          text.setText("Value : " + time_count);
          if(time_count==5){
           cancel();
          }
         }
         public void onFinish(){
          text.setText("Finish");
         }
        }.start();
    }
}

여기에서 onTick 메서드가 지정 시간 마다 돌면서 그 내용을 나타내며 전체 시간이 끝나면 onFinish 메서드에서 마무리 작업을 해 준다.

CountDownTimer의 인자에서 보면 총 10초 간격을 1초로 나누어 작업하게 되어 있다.

[Android] Widjet Event Android 2011. 12. 15. 15:01

위젯을 이용하여 이벤트가 적용 된 것을 말한다.

버튼을 누른다던지 입력을 받는다던지..

간단한 코드를 먼저 보면 앞에서 했던 방식들을 그대로 포함하고 있는 것을 알 수가 있다.

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);
       
        findViewById(R.id.btn1).setOnClickListener(listener);
        findViewById(R.id.btn2).setOnClickListener(listener);
    }
 
 Button.OnClickListener listener = new Button.OnClickListener(){
  
  public void onClick(View view){
   TextView text = (TextView)findViewById(R.id.text);
   switch(view.getId()){
   case R.id.btn1 :
    text.setText("1");
    break;
   case R.id.btn2 :
    text.setText("2");
    break;
   }
  }
 };
}

위젯을 대상으로 했을 때는 저리 하면 되지만 키보드 입력의 경우 onCreate 내부에 setFocusable(true) 와 setFocusableTouchMode(true) 를 꼭!! 포함해야 한다. 그렇지 않으면 동작 하지 않는다!!

또한 xml 상에서 포커스를 이용하는 방법 중에는 nextFocusUp,Left,Right,Down 을 이용하여 포커스 작업을 지정 해 줄 수 있다.

쉽게 이해 하려면 Tab 키를 눌렀을 때 그 인덱스 순서를 지정하는 것과 유사하다.