소스 코드는
package com.paad.todolist;
import android.app.Activity;
import java.util.ArrayList;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ContextMenu;
import android.widget.AdapterView;
public class ToDoList extends Activity {
/** Called when the activity is first created. */
private ArrayList<String> todoItems;
private ListView myListView;
private EditText myEditText;
private ArrayAdapter<String> aa;
static final private int ADD_NEW_TODO=Menu.FIRST;
static final private int REMOVE_TODO=Menu.FIRST+1;
private boolean addingNew =false;
public boolean onCtrateOptionMenu(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);
// itemAdd.setIcon(R.drawable.minus);
// itemRem.setIcon(R.drawable.minus);
itemAdd.setShortcut('0', 'a');
itemRem.setShortcut('1', 'r');
return true;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView =(ListView)findViewById(R.id.myListView);
myEditText=(EditText)findViewById(R.id.myEditText);
todoItems = new ArrayList<String>();
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_DPAD_CENTER){
todoItems.add(0,myEditText.getText().toString());
myEditText.setText("");
aa.notifyDataSetChanged();
cancelAdd();
return true;
}
return false;
}
});
registerForContextMenu(myListView);
}
public void conCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Selected TO DO");
menu.add(0,REMOVE_TODO,menu.NONE,R.string.remove);
}
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;
}
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;
}
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();
}
}
로그캣 에러 표시는 이렇게 나왔습니다.
10-21 10:56:17.867: ERROR/AndroidRuntime(741): Uncaught handler: thread main exiting due to uncaught exception
10-21 10:56:17.897: ERROR/AndroidRuntime(741): java.lang.NullPointerException
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.paad.todolist.ToDoList.onPrepareOptionsMenu(ToDoList.java:113)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.app.Activity.onPreparePanel(Activity.java:2065)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:429)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.policy.impl.PhoneWindow.onKeyDownPanel(PhoneWindow.java:664)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.policy.impl.PhoneWindow.onKeyDown(PhoneWindow.java:1278)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1689)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2329)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2299)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.view.ViewRoot.handleMessage(ViewRoot.java:1621)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.os.Handler.dispatchMessage(Handler.java:99)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.os.Looper.loop(Looper.java:123)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at android.app.ActivityThread.main(ActivityThread.java:4203)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at java.lang.reflect.Method.invokeNative(Native Method)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at java.lang.reflect.Method.invoke(Method.java:521)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
10-21 10:56:17.897: ERROR/AndroidRuntime(741): at dalvik.system.NativeStart.main(Native Method)
/////////////////////////////////////////////////////////////
빨간책 챕터 4에 있는 TodoList 메뉴 예제 그대로 한건데 에러가 발생하네요.
라고 하면서 뒤에 로그가 추가로 표시되지 않나요?
일단은 NullPointerException이 발생한 것으로 보아 객체 생성이 제데로 안된 것이 문제 같군요.
정확한 것은 caused by 뒷부분의 로그를 봐야 알 것 같네요.