안드로이드 개발 질문/답변
(글 수 45,052)
계정 생성 메뉴를 만들고 있습니다.
ID가 DB상에 있는 아이디면 OK버튼을 눌러도 toast에서 "존재하는 아이디입니다."라는 식으로 메세지를 띄우고 dialog창은 종료가 안되게 만들고 싶습니다.
alertDialog의 기본 3버튼(setPositiveButton, ...)은 클릭하면 무조건 dialog가 종료되는거같아서
alertDialog에 setView로 layout내에 버튼을 만들었는데 해당 버튼의 이벤트 처리 방법을 모르겠습니다.
클래스 내에
Button buttonMakeAccountClose = (Button)findViewById(R.id.ButtonMakeAccountCencel);
buttonMakeAccountClose.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
}
});
이렇게 코드를 작성하고 돌려보니까 에러가 나네요..
에러 메세지 내용입니다.
02-12 09:24:56.802: ERROR/AndroidRuntime(387): Uncaught handler: thread main exiting due to uncaught exception
02-12 09:24:56.812: ERROR/AndroidRuntime(387): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.loginTB/my.loginTB.loginTB}: java.lang.NullPointerException
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.os.Looper.loop(Looper.java:123)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at java.lang.reflect.Method.invoke(Method.java:521)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at dalvik.system.NativeStart.main(Native Method)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): Caused by: java.lang.NullPointerException
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at my.loginTB.loginTB.onCreate(loginTB.java:40)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): ... 11 more
ID가 DB상에 있는 아이디면 OK버튼을 눌러도 toast에서 "존재하는 아이디입니다."라는 식으로 메세지를 띄우고 dialog창은 종료가 안되게 만들고 싶습니다.
alertDialog의 기본 3버튼(setPositiveButton, ...)은 클릭하면 무조건 dialog가 종료되는거같아서
alertDialog에 setView로 layout내에 버튼을 만들었는데 해당 버튼의 이벤트 처리 방법을 모르겠습니다.
클래스 내에
Button buttonMakeAccountClose = (Button)findViewById(R.id.ButtonMakeAccountCencel);
buttonMakeAccountClose.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
}
});
이렇게 코드를 작성하고 돌려보니까 에러가 나네요..
에러 메세지 내용입니다.
02-12 09:24:56.802: ERROR/AndroidRuntime(387): Uncaught handler: thread main exiting due to uncaught exception
02-12 09:24:56.812: ERROR/AndroidRuntime(387): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.loginTB/my.loginTB.loginTB}: java.lang.NullPointerException
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.os.Looper.loop(Looper.java:123)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at java.lang.reflect.Method.invoke(Method.java:521)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at dalvik.system.NativeStart.main(Native Method)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): Caused by: java.lang.NullPointerException
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at my.loginTB.loginTB.onCreate(loginTB.java:40)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
02-12 09:24:56.812: ERROR/AndroidRuntime(387): ... 11 more
2010.02.12 21:09:49
일반 Dialog를 만들어도 마찮가지 입니다 ㅠ
음.. 문제가 Custom Dialog 내의 layout 안에 들어있는 view들의 이벤트 처리를 위의 제 코드처럼 일반적인 방식으로 하면 에러가 나는거 같습니다...
밑에 그림 첨부 할께요. 맨밑에 cancel 버튼은 테스트용으로 setPositiveButton써서 만든겁니다. 실제로 사용하면서 이벤트 처리하고 싶은 버튼은 위에 두개입니다.
2010.02.12 23:26:42
loginTB 클래스의 40 번째 줄에 뭐가 있는지 알아야 좀더 쉽게 확인할 수 있을것 같습니다.
일단 그 줄에서 NullPointerException이 발생되도 있는데요. 이것은 그 줄에서 사용되고 있는 어떤 객체라던가 값이 Null인데, 이 Null 객체를 거기에서 사용하려고 하기 때문에 발생되는 문제입니다.
가령 클래스 A 에 x 라는 메소드가 있는데, A a = null; 이렇게 해놓고 a.x(); 이런식으로 호출을 하면 여기서 NullPointerException이 발생합니다. 이럴 때에는 A a = new A(); 이렇게 한 후에 a.x(); 이렇게 해야 하고요...
혹시 40 줄에서 System.out.println(...) 을 호출하셨나요? println 메소드에 넘어가는 문자열이 NULL 값이라면 이 때에도 NullPointerException이 발생되더군요.
그리고 여담인데 명명규칙 같은 것에도 관심을 가지는 것도 좋은 습관이겠습니다. 가령 클래스명은 대문자로 시작한다는 등의...
문제해결에 도움이 됐으면 좋겠습니다.
일단 그 줄에서 NullPointerException이 발생되도 있는데요. 이것은 그 줄에서 사용되고 있는 어떤 객체라던가 값이 Null인데, 이 Null 객체를 거기에서 사용하려고 하기 때문에 발생되는 문제입니다.
가령 클래스 A 에 x 라는 메소드가 있는데, A a = null; 이렇게 해놓고 a.x(); 이런식으로 호출을 하면 여기서 NullPointerException이 발생합니다. 이럴 때에는 A a = new A(); 이렇게 한 후에 a.x(); 이렇게 해야 하고요...
혹시 40 줄에서 System.out.println(...) 을 호출하셨나요? println 메소드에 넘어가는 문자열이 NULL 값이라면 이 때에도 NullPointerException이 발생되더군요.
그리고 여담인데 명명규칙 같은 것에도 관심을 가지는 것도 좋은 습관이겠습니다. 가령 클래스명은 대문자로 시작한다는 등의...
문제해결에 도움이 됐으면 좋겠습니다.
2010.02.13 16:16:04
후우.. 드디어 해결했네요; 버튼 선언할때
= (Button)findViewById(R.id.ButtonMakeAccountCencel);
에서
findViewById쓸때 앞에 layout을 참조하고 있는 dialog 명을 적어야되는군요..
Button buttonMakeAccountClose = (Button)dialogMakeAccount.findViewById(R.id.ButtonMakeAccountCencel);
어쨌든 신경써주신 회색님이랑 sniperx님 감사드립니다 ^^ 10시간동안 끙끙대다가 풀리니까 속이 다 후련하네요;
회색// 네 위에 예제는 AlertDialog로 만든겁니다.