본문 바로가기

안드로이드/고급

[PAAD] 4장 메뉴



public class ToDoList extends Activity {
 
 //메뉴 아이템을 위한 고유 ID
 static final private int ADD_NEW_TODO = Menu.FIRST;
 static final private int REMOVE_TODO = Menu.FIRST + 1;
 
 private ArrayList<String> todoItems;
 private ListView myListView;
 private EditText myEditText;
 private ArrayAdapter<String> aa;
 private boolean addingNew = false;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    
     // 뷰를 인플레이트 시킨다.
     setContentView(R.layout.main);

     // UI 위젯들에 대한 레퍼런스를 얻어온다.
     myListView = (ListView)findViewById(R.id.myListView);
     myEditText = (EditText)findViewById(R.id.myEditText);

     // 해야 할 일들을 담기 위한 배열 리스트(array list)를 만든다.
     todoItems = new ArrayList<String>();
    
     // 이 배열을 리스트 뷰와 묶기 위한 배열 어댑터(array adapter)를 만든다.
     int resID = R.layout.todolist_item;
     aa = new ArrayAdapter<String>(this, resID, todoItems);
    
     // 이 배열 어댑터를 리스트 뷰와 묶는다.
     myListView.setAdapter(aa);

     myEditText.setOnKeyListener(new OnKeyListener() {
         public boolean onKey(View v, int keyCode, KeyEvent event) {
             if (event.getAction() == KeyEvent.ACTION_DOWN)
                 if (keyCode == KeyEvent.KEYCODE_ENTER)
                 {
                     todoItems.add(0, myEditText.getText().toString());
                     myEditText.setText("");
                     aa.notifyDataSetChanged();
                     cancelAdd();
                     return true;
                 }
             return false;
         }
     });

     //뷰를 등록하면 해당 뷰를 위해 컨텍스트 메뉴가 표시되어야 할때마다 onCreateContextMenu가 호출된다
     registerForContextMenu(myListView);
 }
 
 //메뉴를 만든다(액티비티의 메뉴가 처음 표시될때 딱 한번만 표시)
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     super.onCreateOptionsMenu(menu);

     // 새 메뉴 아이템을 만들어 추가한다.
     MenuItem itemAdd = menu.add(0, ADD_NEW_TODO, Menu.NONE, R.string.add_new);
     MenuItem itemRem = menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);

     //하위메뉴를 가진 아이템메뉴를 하나 추가한다(중첩된 하위메뉴는 지원하지 않음)
     SubMenu sub = menu.addSubMenu(0,3,Menu.NONE, "하위메뉴");
     sub.setHeaderIcon(R.drawable.add_new_item); //하위메뉴 타이틀의 아이콘
     sub.setIcon(R.drawable.remove_item);//아이템메뉴에 보이는 아이콘
     MenuItem submenu = sub.add(0,0,Menu.NONE,"하위메뉴아이템");
    
     //6개 이상이면 "더보기"가 자동으로 생성되어 "확장메뉴"에 들어간다
     MenuItem itemAdd1 = menu.add(0, 4, Menu.NONE, "333333");
     MenuItem itemRem2 = menu.add(0, 5, Menu.NONE, "444444");
     MenuItem itemAdd3 = menu.add(0, 6, Menu.NONE, "5555555");    
     itemAdd3.setTitleCondensed("5-5-5-5-5-"); //이 메소드는 아이템메뉴의 텍스트를 바꿀수있다
     MenuItem itemRem4 = menu.add(0, 7, Menu.NONE, "6666666");
     MenuItem itemRem5 = menu.add(0, 8, Menu.NONE, "777777");
     // 아이콘을 할당한다.
     itemAdd.setIcon(R.drawable.add_new_item);
     itemRem.setIcon(R.drawable.remove_item);

     // 이들 각각에 단축키를 할당한다.
     itemAdd.setShortcut('0', 'a');
     itemRem.setShortcut('1', 'r');

     return true;
 }
 
 //콘텍스트 메뉴
 //뷰를 3초간 누르고있으면 나타난다
 //어떤 뷰가 포커스를 가지고 있는지에 따라 메뉴의 내용이 달라진다
 @Override
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
     super.onCreateContextMenu(menu, v, menuInfo);

     menu.setHeaderTitle("할 일 아이템 선택");
     menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);
     menu.add(0, menu.FIRST+1, Menu.NONE, "아이템2").setIcon(R.drawable.icon);
     menu.add(0, menu.FIRST+2, Menu.NONE, "체크박스").setCheckable(true);
     SubMenu sub = menu.addSubMenu("하위메뉴");
     sub.add("하위 아이템");
     menu.add(1, 3,Menu.NONE,"라디오버튼1");
     menu.add(1, 4,Menu.NONE,"라디오버튼2");
     menu.add(1, 5,Menu.NONE,"라디오버튼3").setChecked(true);
     menu.setGroupCheckable(1, true, true);
 }

 //메뉴가 표시되기 전에 현재 상태에 따라 메뉴를 수정할 수 있다
 @Override
 public boolean onPrepareOptionsMenu(Menu menu) {
     super.onPrepareOptionsMenu(menu);

     int idx = myListView.getSelectedItemPosition();

     String removeTitle = getString(addingNew ? R.string.cancel : R.string.remove);

     MenuItem removeItem = menu.findItem(REMOVE_TODO);
     removeItem.setTitle(removeTitle);
     removeItem.setVisible(addingNew || idx > -1);

     return true;
 }
 
 //메뉴아이템 클릭 리스너
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     super.onOptionsItemSelected(item);

     //하이라이트된 아이템
     int index = myListView.getSelectedItemPosition();

     switch (item.getItemId()) {
         case (REMOVE_TODO): {
             if (addingNew) {
                 cancelAdd();
             }
             else {
                 removeItem(index);
             }
             return true;
         }
         case (ADD_NEW_TODO): {
             addNewItem();
             return true;
         }
     }

     return false;
 }
 
 //콘텍스트 메뉴의 아이템이 선택 됬을때
 @Override
 public boolean onContextItemSelected(MenuItem item) {
     super.onContextItemSelected(item);

     switch (item.getItemId()) {
         case (REMOVE_TODO): {
             AdapterView.AdapterContextMenuInfo menuInfo;
             menuInfo =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
             int index = menuInfo.position;

             removeItem(index);
             return true;
         }
     }
     return false;
 }
 
 private void cancelAdd() {
     addingNew = false;
     myEditText.setVisibility(View.GONE);
 }

 private void addNewItem() {
     addingNew = true;
     myEditText.setVisibility(View.VISIBLE);
     myEditText.requestFocus();
 }

 private void removeItem(int _index) {
     todoItems.remove(_index);
     aa.notifyDataSetChanged();
 }
}