尝试显示对话框时应用程序崩溃

App crashed when try to display dialog box

只是一个简单的事情,点击按钮时应用程序应该显示对话框。但是当它被点击时,它崩溃了。而且我不明白 logCat 错误试图说的是什么。

 addImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final Dialog dialog = new Dialog(getApplication());
                dialog.setContentView(R.layout.custom_dialog_box);
                dialog.setTitle("Alert Dialog View");
                Button btnExit = (Button) dialog.findViewById(R.id.btnExit);
                btnExit.setOnClickListener(new View.OnClickListener() {
                    @Override public void onClick(View v) {
                        dialog.dismiss();
                    }
                });
                dialog.findViewById(R.id.btnChoosePath)
                        .setOnClickListener(new View.OnClickListener() {
                            @Override public void onClick(View v) {
                               // activeGallery();
                            }
                        });
                dialog.findViewById(R.id.btnTakePhoto)
                        .setOnClickListener(new View.OnClickListener() {
                            @Override public void onClick(View v) {
                                //activeTakePhoto();
                            }
                        });

                // show dialog on screen
                dialog.show();
            }

            });

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@color/light_gray"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:layout_height="fill_parent">

    <Button
        android:onClick="btnChoosePathClicked"
        android:id="@+id/btnChoosePath"
        android:background="@color/honey_dew2"
        android:textColor="@color/black"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:width="200dp"
        android:text="From Gallery"/>

    <Button
        android:onClick="btnTakePhotoClicked"
        android:id="@+id/btnTakePhoto"
        android:background="@color/honey_dew2"
        android:textColor="@color/black"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/btnChoosePath"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"
        android:width="200dp"
        android:text="Take Photo"/>

    <Button
        android:onClick="btnExitClicked"
        android:id="@+id/btnExit"
        android:background="@color/honey_dew2"
        android:textColor="@color/black"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/btnTakePhoto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:width="200dp"
        android:text="Exit"/>
</RelativeLayout>

LogCat错误

12-09 17:57:34.344  18804-18804/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
            at android.view.ViewRootImpl.setView(ViewRootImpl.java:698)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:281)
            at com.example.project.myapplication.GUI.AddMoreClaims.onClick(AddMoreClaims.java:68)
            at android.view.View.performClick(View.java:4230)
            at android.view.View$PerformClick.run(View.java:17660)
            at android.os.Handler.handleCallback(Handler.java:800)
            at android.os.Handler.dispatchMessage(Handler.java:100)

其中 (AddMoreClaims.java:68) 指的是 dialog.show();。这里有什么问题吗?

Unable to add window -- token null is not for an application

因为getApplication()重新调整null

使用v.getContext()ActivityName.this创建Dialog对象:

final Dialog dialog = new Dialog(v.getContext());
OR
final Dialog dialog = new Dialog(ActivityName.this);

像下面的代码一样进行 dialog 声明:

对于Activity:

final Dialog dialog = new Dialog(Your_Activity_Name.this);

片段:

final Dialog dialog = new Dialog(getActivity());

您不能使用应用程序上下文创建对话框,您应该使用 Activity 上下文。

new Dialog(MyActivity.this); //if you use Activity
new Dialog(getActivity()); //if you use Fragment 

你应该在 activity 中显示你的对话框,而不是在应用程序中。 在您当前打开的 activity 中打开您的对话框,它应该适合您。

正如其他人在上面所说的那样,您的上下文即 getApplication() 是错误的。

这是因为您需要当前 Activitycontext 才能在其上显示任何内容(弹出窗口、视图、对话框)。

尽管您可以使用 getApplicationContext() 来启动新的 Activity,但您将不得不使用 this(在 Activity 内)或 getActivity()在片段内。

这里有更多关于 Context and which one to use and when

的信息