我有一个自定义对话框。点击一个按钮我正在显示它。现在我在自定义对话框中有一个按钮,我想在点击该按钮时将其关闭,但它会抛出任何空指针异常。这是我的代码我用来表明它:
private void showPreConfirmationDialog() {
final Dialog dialog= new Dialog(context);;
button = (ImageView) findViewById(R.id.bookButton);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.setContentView(R.layout.pre_confirmation_dailog);
//dialog.setCancelable(false);
dialog.setTitle("OnWard Details...");
dialog.show();
}
});
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
backPreConfirmation.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
}
点击backPreConfirmation按钮时,它会抛出我的错误:
07-30 09:25:15.830: E/AndroidRuntime(26599): FATAL EXCEPTION: main
07-30 09:25:15.830: E/AndroidRuntime(26599): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.result/com.android.result.Result}: java.lang.NullPointerException
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.os.Looper.loop(Looper.java:137)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-30 09:25:15.830: E/AndroidRuntime(26599): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 09:25:15.830: E/AndroidRuntime(26599): at java.lang.reflect.Method.invoke(Method.java:511)
07-30 09:25:15.830: E/AndroidRuntime(26599): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-30 09:25:15.830: E/AndroidRuntime(26599): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-30 09:25:15.830: E/AndroidRuntime(26599): at dalvik.system.NativeStart.main(Native Method)
07-30 09:25:15.830: E/AndroidRuntime(26599): Caused by: java.lang.NullPointerException
07-30 09:25:15.830: E/AndroidRuntime(26599): at com.android.result.Result.showPreConfirmationDialog(Result.java:66)
07-30 09:25:15.830: E/AndroidRuntime(26599): at com.android.result.Result.onCreate(Result.java:41)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.Activity.performCreate(Activity.java:5104)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-30 09:25:15.830: E/AndroidRuntime(26599): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-30 09:25:15.830: E/AndroidRuntime(26599): ... 11 more
我有什么不对请告诉我
答案 0 :(得分:2)
您需要使用对话框对象来初始化视图
final Dialog dialog= new Dialog(context);
dialog.setContentView(R.layout.pre_confirmation_dailog);
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
在onCreate
button = (ImageView) findViewById(R.id.bookButton);
然后
button.setOnClickListener( new OnClickListener()
{
public void onClick(View v)
{
showPreConfirmationDialog();
}
});
在showPreConfirmationDialog()
中private void showPreConfirmationDialog() {
final Dialog dialog= new Dialog(context);
dialog.setContentView(R.layout.pre_confirmation_dailog);
dialog.setTitle("Loading...");
dialog.show();
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
backPreConfirmation.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
}
注意:您可以将当前视图层次结构的findViewById
设置为活动。您可以将布局的内容设置为对话框。并且您在该布局中有按钮backPreConfirmation
。因此,您需要使用对话框对象来膨胀按钮。
答案 1 :(得分:1)
上面的解决方案有效,但它有点长,我想最好的解决方案是使Dialog对象全局或您正在处理的活动的字段,然后当您使用它时,使用方法dismiss()在对象上。
//out side any method(global domain)
private Dialog dialog;
//inside the button handler of the dialog
dialog.dismiss();
答案 2 :(得分:0)
你必须改变这两个:
button = (ImageView) dialog.findViewById(R.id.bookButton);
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
所以,现在你可以得到适当的解决方案。
答案 3 :(得分:0)
因为“backPreConfirmation”不在你的主要布局中。它在你的“pre_confirmation_dailog
”布局中。要获得此方法,请执行以下操作,
replace
backPreConfirmation = (ImageView)findViewById(R.id.backImage);
with
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
答案 4 :(得分:0)
这样做
button = (ImageView) dialog.findViewById(R.id.bookButton);
这可能会解决您的问题。
答案 5 :(得分:0)
您正在将当前活动视图的引用设置为对话框的子项,而不是此用户对话框,用于设置对所有对话框子项button = (ImageView)dialog.findViewById(R.id.bookButton);
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
的引用
答案 6 :(得分:0)
private void showPreConfirmationDialog(){
button = (ImageView) findViewById(R.id.bookButton);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
final Dialog dialog= new Dialog(context);
dialog.setContentView(R.layout.custom);// Custome layout xml
dialog.setTitle("OnWard Details...");
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
backPreConfirmation.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
dialog.show();
}
});
}
试试这个
答案 7 :(得分:0)
试试这个。 ...
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final Dialog dialog = builder.create();
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
dialog.dismiss();
}
});
dialog.show();
...