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();
}
}
'안드로이드 > 고급' 카테고리의 다른 글
[PAAD] 5장 커스텀 어뎁터 & 리스트 (0) | 2011.08.29 |
---|---|
[PAAD] 5장 인텐트 (0) | 2011.08.29 |
[PAAD] 4장 커스텀 뷰 만들기 (2) | 2011.08.14 |
[PAAD] 4장 리소스 드로어블 (링크_참고자료) (0) | 2011.08.14 |
[PAAD] 3장 리소스 런타임구성, 애플리케이션확장, 액티비티생명주기 (0) | 2011.08.14 |