안드로이드에서 제공하는 View Object에서는 사용자의 Event를 처리할 수 있도록 callback method를 제공하며 이에 적절한 listner를 구현하여 사용하면 된다.
하지만 개발자가 정의한 View Object는 handler를 정의하여 사용하도록 한다.

Event Listners
  Event Listner는 single callback method를 포함하는 View Object의 Interface이다.
사용자의 Event가 발생하면 안드로이드 Framework은 해당 View에 등록되어 있는 Listner를 호출한다.
View Object에서 제공하는 Callback method는 다음과 같다.
onClick(), onLongClick(), onFocusChange(), onKey(), onTouch(), onCreateContext()
이러한 method를 정의하고 사용자 event를 다루기 위해서는 해당 View Object의 Event에 해당하는 Listner를 구현하고 이들 등록해서 사용한다.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}
또는
mPickTime = (Button) findViewById(R.id.pickTime);
// add a click listener to the button
mPickTime.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(TIME_DIALOG_ID);
            }
        });


Evnet Handlers
  View Object를 상속하여 사용자가 정의하는 Component를 만드는 경우 사용할 기본 handler로서 callback method를 정의해야 한다.
Event를 다루기 위해 사용되는 일반적인 callback method는 다음과 같다.
onKeyDown(), onLeyUp(), on TrackballEvent(), onTouchEvent(), onFocusChanged()

Touch Mode
  단말기가 Touch Mode인지를 확인하기 위해서는 isInTouch() method를 사용하여 확인한다.

Handling Focus
 View Class가 Focus를 가지는지 확인하기 위해서는 isFocusable()을 통해 확인할 수 있으며, View Class의 Focus를 변경하기 위해서 setFocusable() method를 사용한다.
단말이 Touch Mode일 경우는 isFocusableInTouchMode()와 setFocusableInTouchMode()를 사용할 수 있다.
이러한 Focus의 변경은 XML을 통해서도 정의가 가능하다.
<LinearLayout
    android:orientation="vertical"
    ... >
  <Button android:id="@+id/top"
          android:nextFocusUp="@+id/bottom"
          ... />
  <Button android:id="@+id/bottom"
          android:nextFocusDown="@+id/top"
          ... />
</LinearLayout>

nextFocusDown, nextFocusLeft, nextFocusRight, and nextFocusUp 사용할 수 있으며,
Focus변경을 위해  android:focusable 또는 android:focusableInTouchMode를 사용한다.

Posted by 피의복수

안드로이드에서 지원하는 Dialog는 다음과 같은 4가지 타입이 있다.
1. AlertDialog
  AlertDialog를 사용가지 위해서는 AlertDialog.Builder를 사용한다.
  1) Button이 있는 Dialog 만들기
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                MyActivity.this.finish()
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();

  2) List가 있는 Dialog 만들기
final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

  3) Check or Radio Button Dialog 만들기
final CharSequence[] items = {"Red", "Green", "Blue"};

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
});
AlertDialog alert = builder.create();

2. ProgressDialog
  1) 일반 Progress Dialog
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true);

  2) Animated Progress Dialog
ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);

3. DatePickerDialog

  날짜와 관련된 Dialog를 나타낸다.
DatePickerDialog.OnDateSetListener를 생성하여
DatePickerDialog(Context , OnDateSetListener, Year, Month, Day);
로 생성이 가능하며 날짜에 대한 제어가 가능하다.

4. TimepickerDialog
  시간과 관련된 Dialog를 나타낸다.
TimePickerDialog.OnTimeSetListener를 생성하여
TimePickerDialog(Context , OnTimeSetListener, Hour, Munite, 24시간 표현);
로 생성이 가능하며 시간에 대한 제어가 가능하다.

Custom Dialog
Android에서 지원하는 Dialog외 사용자가 정의하는 Dialog를 생성하여 사용할 수 있다.
사용자 정의 Dialog는 Layout으로 View Object를 생성하여 사용할 수 있으며, AlertDialog.builder를 통해 생성한다.
AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                               (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();


Posted by 피의복수

안드로이드는 다음과 같은 3가지 타입의 메뉴를 제공한다.

1. Options Menu
Options menu는 단말기의 MENU Key를 누를때 생성되는 가장 기본적인 메뉴이다. 
한 화면에 나타낼수 있는 메뉴의 수는 최대 6개 이며 이렇게 나타내 지는 메뉴는 Icon menu이고 6개를 초과하는 경우에 대해 Icon menu에 "More"라고 노출이되는데 이것을 Expanded Menu라고 한다.
Application이 실행된 후 사용자가 단말의 MENU Key를 선택하면 Android System은 Activity의 onCreateOptionsMenu() callback method를 호출하게 된다.
메뉴의 Item은 XML에 정의할 수도 있고 소스코드내에서 구현할 수도 있다. (이러한 부분은 Layout에서도 설명한 바 있다.)
메뉴가 선택되는 Android System은 Activity에 onOptionsItemSelected() callback method를 호출하며, 사용자가 선택한 MenuItem을 전달한다. 개발자는 전달받은 menuItem의 getItemId()를 조회하여 적절한 Action을 하면 된다.

아래의 소스 코드는 MENU Key가 선택되었을 경우 Menu를 생성하는 방식을 설명한다.
/* Creates the menu items */
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, MENU_NEW_GAME, 0, "New Game");
    menu.add(0, MENU_QUIT, 0, "Quit");
    return true;
}

아래의 코드는 XML로 생성되는 메뉴이다.
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:title="New Game" />
    <item android:id="@+id/quit"
          android:title="Quit" />
</menu>
위와 같은 XML을 /res/menu/options_menu.xml로 저장한다.

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    return true;
}

이제 Options Menu에 Icon을 넣어보자. Icon menu를 만들기 위해서 우선 /res/drawable/에 quit_icon.png를 저장한다고 가정한다.
아이콘이 있는 메뉴도 두가지 방식으로 만들어질 수 있다.
menu.add(0, MENU_QUIT, 0, "Quit")
    .setIcon(R.drawable.quit_icon);

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/quit"
          android:icon="@drawable/quit_icon"
          android:title="Quit" />
</menu>


혹시나 MENU key가 선택될때마다 메뉴를 변경하고 싶다면, onPrepareOptionsMenu() method를 override하면 된다. 사용은 onCreateOptionsMenu() method의 사용과 유사하다.
 
2. Context Menu
Android의 Context 메뉴는 PC상에서 오른쪽 마우스를 Click하여 나오는 메뉴와 유사하다.
대부분의 View Object에서 사용이 가능하나 거의 대부분 listView에서 사용이되며 list에서 Item을 선택한 후 조금 길게 선택하면 Context Menu를 확인할 수 있다.
Application이 실행된 후 사용자가 단말의 특정 View Object를 선택하면(조금 오래 누르고 있으면 됨) Android System은 Activity의 onCreateContextMenu()callback method를 호출하게 된다.
메뉴의 Item은 XML에 정의할 수도 있고 소스코드내에서 구현할 수도 있다. (이러한 부분은 Layout에서도 설명한 바 있다.)
메뉴가 선택되는 Android System은 Activity에 onContextItemSelected() callback method를 호출하며, 사용자가 선택한 MenuItem을 전달한다. 개발자는 전달받은 menuItem의 getItemId() 및 getMenuInfo()를 조회하여 적절한 Action을 하면 된다.

3. Submenu
Options menu는 submenu를 가질 수 있다.
submenu도 다른메뉴와 같이 소스내에서 또는 XML로 생성될 수 있다.
public boolean onCreateOptionsMenu(Menu menu) {
  boolean result = super.onCreateOptionsMenu(menu);

  SubMenu fileMenu = menu.addSubMenu("File");
  SubMenu editMenu = menu.addSubMenu("Edit");
  fileMenu.add("new");
  fileMenu.add("open");
  fileMenu.add("save");
  editMenu.add("undo");
  editMenu.add("redo");

  return result;
}

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
        android:title="File">
        <menu>       
            <item android:id="@+id/new"
                android:title="New" />
            <item android:id="@+id/open"
                android:title="Open" />
            <item android:id="@+id/save"
                android:title="Save" />
        </menu>
    </item>
    <item android:id="@+id/edit"
        android:title="Edit">
        <menu>       
            <item android:id="@+id/undo"
                android:title="Undo" />
            <item android:id="@+id/redo"
                android:title="Redo" />
        </menu>
    </item>
</menu>

참고:
Menu Item을 추가할 때 각 Item을 Group으로 묶어서 관리할 수 있도록 했다. 따라서 동일한 속성을 가지는 menu Item은 group으로 설정하여 관리하면 된다.
Menu Group의 속성은 visible, enable, checkable 등이 있으면 이는 setGroupVisible(), setGroupEnabled(), setGroupCheckable()등이 method를 사용하거나 XML 파일로 관리할 수 있다.

menu.add(0, MENU_1, 0, "1")
    .setCheckable(true);

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/disabled_item"
        android:title="Disabled"
        android:checkable="true" />
     ....
</menu>






Posted by 피의복수

Layout은 Activity에서의 User Interface를 위한 Architecture이다.

Layout은 두가지의 방식으로 선언할 수 있다.
1. XML의 UI elements로 정의
2. Runtime 시 layout elements instance 생성

다음은 Layout의 XML 예제이다. 이것을 기초로 layout에 대해 학인해 보도록 하자.
<?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" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>
이렇게 생성한 XML파일은 res/layout에 저장되어야 한다.

eclipse를 이용하는 경우
상단 Toolbar의 Android XML 생성 button을 Click하며 아래와 같은 화면을 볼 수 있다.
resource type은 "Layout"으로 설정하고 Project 및 생성될 파일명을 설정한다.

Folder에서 보는 것 처럼 Type을 layout으로 할 경우 /res/layout에 XML 파일이 생성된다. Type을 변경해 보면 Folder가 변경되는 것을 확인할 수 있다. 우선 main.xml로 저장한다고 가정하자.

자 그럼 이렇게 만들어진 layout을 프로그램에 어떻게 구현할까?
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView.(R.layout.main);
}
한 줄만 추가하면 된다.
setContentView.(R.layout.main);
R은 뭐냐고? main.xml을 만들고 build하면 안드로이드가 자동으로 R.java를 생성한다. (어디에? /gen 이라고 있다.) 실제 가보면 main.xml에 정의된 내용이 class로 되어 있고 또한 resource에 id가 붙어있다.

자 이제 하나씩 살펴보기로 하자.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>
지금 사용하는 것은 Linearlayout이다 . 또한 layout의 width와 height에 대해 정의하고 각 View가 나타나는 방향을 지정한다.
layout_width, layout_height 등과 같이 layout에서 사용하는 변수를 layout parameter라고 한다.
width와 height는 "fill_parent" 와 "wrap_content"를 사용할 수 있는데 fill_parent는 현재 단말의 모든 영역을 사용하라는 뜻이고, wrap_content는 해당 View class의 영역에 맞도록 사용한다는 뜻이라고 한다. 절대적이냐 상내적이냐의 차이라고 보면 되겠다.
현재 정의되어있는 View는 TextView와 Button으로 구성되어 있다. "orientation" 대로 맨위에 TextView가 나오그 그 밑으로 Button이 출력되게 되어있다.
TextView나 Button을 보면 "id"라는 것이 있다. 이것은 resource ID이다.
"@"라고 되어있는 부분은 XML Parser가 파싱할 부분이라는 것을 지시하고, "+"는 새로 생성해야 하는 Resource라는 것을 나타낸다.
안드로이드가 제공하는 Resource를 사용하는 경우는 "@android:id/xxx" 이렇게 사용하면 되겠다.

*** 여기서 잠깐.
layout에 정의되어 있는 View Object를 꺼내서 사용하려면?
걱정하지 마라. instance로 선언해서 사용하면 된다. 예를 들면 Button인 경우
Button myButton = (Button) findViewById(R.id.button); 이렇게....ㅎㅎㅎ
R.id.xxx에는 layout에서 정의한 ID를 사용하면 되겠다.



Posted by 피의복수

안드로이드의 User Interface는 View class를 상속받은 다양한 View와 View Group으로 구성되어진다.

안드로이드는 User Interface를 구현하기위해 widgets이라고 불리는 View class의 subclass를 제공한다. (android.widget package를 보면 다양한 view가 존재한다. text 및 button 등)
View Group은 layout이라고 불리는 ViewGroup class의 subclass를 제공한다. (linear, tabular 및 relative와 같은 다양한 layout architecture)

View Hierarchy

Application을 구현하는 Activity에서 setContentView() method를 호출하여 구현한다.

Layout
XML File을 통해 layout을 정의할 수 있다.
  <?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" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
</LinearLayout>

위에서 정의한 파일의 내용으로 보면 현재 layout은 Linearlayout을 사용하면 TextView를 UI에 표현한다.
위의 파일을 main.xml이라 네이밍하고 \Project root\res\layout에 저장한다.
그리고 정의하는 Activity에서 setContentView(R.layout.main); 이라 코드에 추가해 주면 자동으로 해당 layout에 TextView를 화면에 출력하게 된다.
eclipse를 기준으로 보면 위의 main.xml을 저장하고 Build할 경우 \Project root\gen 이 생성되며, 이 밑으로 R.java라는 파일이 생성된다.
public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}
따라서 R.layout.main.main에 해당하는 UI를 출력하게 된다.
만일 TextView를 main.xml에 정의하지 않는다면
        TextView tv = new TextView(this);
        tv.setText("Hello, Android");
        setContentView(tv);
이와 같이 소스코드 내에서 생성할 수도 있다. 어느 것이 더 편한지는 사용자의 몫이다.

Widgets
Widget은 위에서도 설명했듯이 User Interface를 구현하기 위한 UI Component라고 보면 된다.
android.widget package에 정의되어 있는 class를 참조하면 된다.

UI Events
User Event를 다루기 위해서는 다음과 같은 두가지의 방법 중에 선택해서 사용한다.
1. Event Listener를 정의하고 View에 등록하는 방법
  - View는 각각의 Event에 대해서 Listener Interface를 가지고 있다. View.OnClickListner, View.OnTouchListner, View.OnKeyListner 등으로 구성된다. 또한 각각의 Event Listner에 대해서 callback method를 가지고 있는데 예를 들면 Click Event에 대해서는 OnClick() 등으로 구성되게 된다.
2. 기존의 View의 callback을 Override하는 방법
  - System에서 제공되는 View class 외 사용자가 정의하는 View class에서는 기존의 callback을 Override하여 사용할 수 있다.

Menus
메뉴는 단말기의 MENU key를 선택할 경우에 나타나는 일반적인 메뉴와 아이템선택 시 등에 나타나게 할 수 있는 Context Menu로 나누어 질 수 있으며, 일반적인 메뉴는 onCreateOptionsMenu()와 onOptionsItemSelected()를 사용하여 구현하며,
Context Menu는 onCreateContextMenu()와 onContextItemSelected()로 구현할 수 있다.
또한 Layout을 정의하는것과 같이 각 메뉴의 항목도 xml로 정의하여 사용할 수 있다.

Advanced Topics

Posted by 피의복수

BLOG main image
일에 필요한 자료 by 피의복수

카테고리

분류 전체보기 (40)
프로그램이야기 (38)
끄적끄적 (1)
취미 (0)
서비스이야기 (1)
빅데이터 (0)

최근에 올라온 글