Toast 사용자 임의 수정 가능함.(아래 파일 참조)
file:///C:/android/android-sdk-windows/docs/guide/topics/ui/notifiers/toasts.html
Toast 바로 표시하기!(??) 어떻게 할까요??

에뮬레이터에서 F6 : 트랙볼

다국어 관련 파일들 존재
C:\android\android-sdk-windows\platforms\android-7\data\res
mcc : Mobile Climate Control  ???
mnc : Media Nusantara Citra   ???
위의 둘다 지원함.
res 에 values/Language 추가(이때 기존의 values/strings.xml 파일과 이름이 동일해야함
로케일 변경하면 자동적으로 다국어 변환됨.

- anonymouse inner class(안드로이드에서 빈번하게 사용됨)
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});

<Thread>
Looper : 메시지 루프를 구동함
Handler : 메시지 큐에 메시지를 넣음. 메시지 큐에서 메시지를 꺼냄
Bundle class : key-value형태로 데이터를 관리하는 클래스
ex)
Message msg = thread.mHandler.obtainMessage(); (미리 만들어논 메시지가 
있다면사용되지 않는 object 리턴[최적화])
Bundle b = new Bundle();
b.putInt("total", total);
msg.setData(b);     // msg.getData().getInt("total");(가져오기)
thread.mHandler.sendMessage(msg);

Handler는 생성되는 위치에따라서 Parent의 thread와 결합하여 동작되게 된다.
(메시지큐 동일하게 사용함)


<Menu>
1. Option menu(Web browser의 옵션)
- Icon menu
- Expanded menu

  Menu버튼을 click했을때(Activity.onCreateOptionsMenu()) 자동호출
  메뉴가 최초에 open 될때 호출됨.
  source-override Implement methods... 에서 코드 자동추가 가능함.

  menu추가 방법
  code : Menu.add() 
ex)       
menu.add(groupId, itemId, order, title)
menu.add(0, Menu.FIRST+1, 0, "Menu1");
menu.add(0, Menu.FIRST+2, 0, "Menu2");
(Menu.FIRST 는 Menu class에서 권장하는 초기 itemId 상수임.)

- Menu.add()는 MenuItem객체를 리턴하므로 MenuItem의 객체를 바로 수정가능하다.
ex)
 menu.add(0, MENU1, 0,"Menu1").setIcon(R.drawable.icon); (아이콘추가)
 menu.add(0, MENU1, 0, Menu1").setIcon(android.R.drawable.ic_btn_speak_now));
(android에 내장된 icon 객체를 바로사용할수 있음)
            
C:\android\android-sdk-windows\platforms\android-7\data\res\
drawable-mdpi 위치에서 확인가능함.

menu 수가 6개 이상일때는 화면을 많이 가려 불편할수 있으므로 5개까지 표시한후
More 버튼이 마지막에 표시되며, 나머지 6번째 이상부터 표시된다. 이때 아이콘은 표시되지 않는다.

MenuItem을 click했을때(Activity.onOptionsItemSelected()) 호출됨.

ex)
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case MENU1:
Toast.makeText(this, "MENU1 Selected", Toast.LENGTH_SHORT).show();
return true;
case MENU2:
...

  menu항목을 상황에 따라 바꾸고 싶을때.(Toggle button(ex.power on/off))
  메뉴가 열릴때마자 Activity.onPrepareOptionsMenu()자동으로 호출됨.

  ex)
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(MENU2);
if (mPowerState)
{
item.setTitle("Power On");
}
else
{
item.setTitle("Power Off");
}

* onOptionsItemSelected()에서 선택했을때 바로 text를 바꿀수도 있지만.
  일반적으로는 선택후 다음에 메뉴가 보여질때(onPrepareOptionsMenu()) 에서
  text를 변경함.


 - XML -
menu.xml 파일을 생성한후 코드에서 아래와 같이 추가한다.
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options_menu, menu);
return super.onCreateOptionsMenu(menu);
}

XML 에서 resource 참조 방법(Layout)

ex) for XML
android resource : @android:drawable/ic_dialog_email 
   (android.R.drawable 에있는 기본 아이콘중하나)
user resource : @string/menu2 


2. Context menu(mouse long click)
- long clicked시 Activity.onCreateContextMenu()가 호출된다.
  (누르는 위치에따라 동작이 다르며, Avtivity.registerForContextMenu()를 해주어야 동작이됨.)
   각 component들은 id값을 가지고 있어야한다.
   ContextMenu에서 setIcon은 적용되지 않는다.
   
3. Submenu
- 다른 메뉴들과 같이 사용된다. 하위계층.
  Parent의 callback function onOptionsItemSelected()/ onContextItemSelected()에서 
  같이 처리됨. Parent의 menuID와 중복되면 안된다.

ex)
SubMenu subMenu = menu.addSubMenu("MENU3");
subMenu.add(0, SUBMENU1, 0, "SUB Menu1");
subMenu.add(0, SUBMENU2, 0, "SUB Menu2");
subMenu.add(0, SUBMENU3, 0, "SUB Menu3");



<Dialog>

- AlertDialog (Ok,Cancel 같이 항목들중 한가지 선택가능하도록)
AlertDialog는 back 버튼 동작되지 않는다.
(AlertDialog.Builder.setCancelable(true) 하면 가능함)
ex)
protected Dialog onCreateDialog(int id) {
switch(id)
{
case DIALOG1:
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?");
builder.setCancelable(false);
builder.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
   DialogTest.this.finish();
}
});
builder.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
return alert;
}
    case DIALOG2:
    {
      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();
    return alert;
     }
     case DIALOG3:
    {
             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();
return alert
    }

 setPositiveButton : 긍정의미의 버튼
 setNeutralButton : 중립의미의 버튼
 setNegativeButton : 부정의미의 버튼
 (위의 3버튼들을 사용자 임의로 설정할수 있다.)

- ProgressDialog(진행사항표시)
setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) 일반적인 퍼센트 표시
setProgressStyle(ProgressDialog.STYLE_SPINNER) 끝나는 시점을 예측하기 힘들때 사용됨.

- DatePickerDialog(날짜)
- TimePickerDialog(시간)

- CustomDialog(user create)


Activity.showDialog(int) 로 Dialog가 보여진다.
showDialog() 호출시 최초 Dialog가 생성될때 
Activity.onCreateDialog(int) 가 자동으로 호출된다.
onCreateDialog()에서 생성된 Dialog 객체를 return 해준다.

Activity.onPrepareDialog(int, Dialog) Dialog가 display 되기전에 호출된다.

Dialog 종료하기 
1. Dialog.dismiss(), Activity.dismissDialog(int) (화면에 보여지지만 않음)
2. Activity.removeDialog(int) 완전히 삭제 소멸


<Handling UI Events>
- Event listener : 일반적인 button clicked 같은 이벤트 listener
- Event handler : 클래스를 확장하여 기능을 변경함.
                        (트랙볼같은경우는 handler에서 처리해야 자세한 정보를얻을수있다.)

ll.setFocusable(true) : focus상태에서만 key를 입력을 받는다.
ll.setFocusableInTouchMode(true);   : 터치모드에서도 key 입력을 받는다.

onKey()에서 return true는 onKey()에서 처리가 완료되었으므로 더이상
parent()로 이벤트 전달하지 않는다.

onTouch()에서 return true/false 차이점.
최초의 터치 이벤트를 처리안했다고 하면(return false) 그 이후에 마우스 이동시
이벤트가 발생이안된다.즉 Android에서는 처음 Touch 이벤트 처리가 안되면, 
그다음은 의미가 없다고 생각함. return false 를 하면 후속 이벤트 발생안됨.