6

我有一个自定义对话框。所以单击按钮我正在显示它。现在我在自定义对话框中有一个按钮,我想在单击该按钮时关闭它,但它会引发任何空指针异常。这是我的代码用来显示它:

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

我有什么问题请告诉我

4

8 回答 8

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在那个布局中有按钮。所以你需要使用对话框对象来膨胀你的按钮。

于 2013-07-30T09:43:31.793 回答
0

你必须像这样改变两者:

button = (ImageView) dialog.findViewById(R.id.bookButton);
backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);

所以,现在你可以得到适当的解决方案。

于 2013-07-30T09:42:31.840 回答
0

私人无效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();

        }
    });

}

尝试这个

于 2013-07-30T09:53:11.727 回答
0

您正在将当前活动视图的引用设置为对话框的子项,而不是使用此对话框来设置对所有对话框子项的引用button = (ImageView)dialog.findViewById(R.id.bookButton); backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);

于 2013-07-30T09:48:04.800 回答
0

这是因为“backPreConfirmation”不在您的主布局内。它在您的“ pre_confirmation_dailog”布局内。要获得此方法,请执行以下操作,

replace
  backPreConfirmation = (ImageView)findViewById(R.id.backImage);
with

  backPreConfirmation = (ImageView)dialog.findViewById(R.id.backImage);
于 2013-07-30T09:43:44.793 回答
0

做这个

button = (ImageView) dialog.findViewById(R.id.bookButton);

这可能会解决您的问题。

于 2013-07-30T09:44:12.523 回答
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();

...

于 2017-08-28T18:07:51.843 回答
0

上面的解决方案有效,但有点长,我想最好的解决方案是使 Dialog 对象成为全局对象或您正在处理的活动的字段,然后当您完成使用它时,在对象上使用方法 dismiss() .

//out side any method(global domain)
private Dialog dialog;

//inside the button handler of the dialog
dialog.dismiss();
于 2017-10-27T06:34:48.830 回答