Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android alertDialogBuilder仅在重新启动应用程序时崩溃_Android_Crash_Relaunch - Fatal编程技术网

Android alertDialogBuilder仅在重新启动应用程序时崩溃

Android alertDialogBuilder仅在重新启动应用程序时崩溃,android,crash,relaunch,Android,Crash,Relaunch,我有一个“alertDialogBuilder”可以在按下按钮时重命名条目。当应用程序刚打开时,此功能可以正常工作。但如果我按下后退按钮(意味着应用程序被最小化,我回到Android主屏幕),当我重新启动应用程序并按下按钮时,这次应用程序崩溃。每次都会发生这种情况,我不知道如何调试它。我已经检查了生命周期,按下后退按钮时会调用“onPause”和“onStop”。但我不明白为什么这会成为一个问题 有什么想法吗 下面是我在助手类中启动提示对话框的代码: public void loadPrompt

我有一个“alertDialogBuilder”可以在按下按钮时重命名条目。当应用程序刚打开时,此功能可以正常工作。但如果我按下后退按钮(意味着应用程序被最小化,我回到Android主屏幕),当我重新启动应用程序并按下按钮时,这次应用程序崩溃。每次都会发生这种情况,我不知道如何调试它。我已经检查了生命周期,按下后退按钮时会调用“onPause”和“onStop”。但我不明白为什么这会成为一个问题

有什么想法吗

下面是我在助手类中启动提示对话框的代码:

public void loadPromptInput(Context promptcontext, final OnOkGetText onOk, String InitialTxt) {

    //pathText.setText("Prompt input");
    LayoutInflater li = LayoutInflater.from(promptcontext);
    View promptsView = li.inflate(R.layout.prompts_dialog, null);
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( promptcontext);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final EditText userInput = (EditText) promptsView
            .findViewById(R.id.editTextDialogUserInput);
    userInput.setText("");
    userInput.append(InitialTxt);
      alertDialogBuilder
            .setCancelable(false)
            .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {

                            onOk.hereIsYouText(userInput.getText().toString());
                        }
                    })
            .setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();

    // make the keyboard shown by default
    alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
E/AndroidRuntime:致命异常:主 进程:com…,PID:31622 android.view.WindowManager$BadTokenException:无法添加窗口-- 代币android.os。BinderProxy@423c9940无效;你的活动是什么 跑步 位于android.view.ViewRootImpl.setView(ViewRootImpl.java:532) 在 addView(WindowManagerGlobal.java:259) 在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 在android.app.Dialog.show上(Dialog.java:286) 在 com…myUtils.loadPrompInput(myUtils.java:71) 在 com….MainActivity$6.onReceive(MainActivity.java:557) 在 android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:308) 在 android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) 在 android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:118) 位于android.os.Handler.dispatchMessage(Handler.java:102) 位于android.os.Looper.loop(Looper.java:136) 位于android.app.ActivityThread.main(ActivityThread.java:5095) 位于java.lang.reflect.Method.Invokenactive(本机方法) 位于java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 在 com.zte.heartyservice.SCC.FrameworkBridge.main(FrameworkBridge.java:136) 在dalvik.system.NativeStart.main(天然冰毒)


od)

查看您的代码以查看您调用的位置会很有帮助:

void loadPromptInput(上下文提示上下文…

…很可能您正在作为参数传递一个不再有效的上下文实例

在任何情况下,在调用方法之前,请检查活动是否已完成:

//in a fragment
if(getActivity() != null && !getActivity().isFinishing()) {
    loadPromptInput(getActivity()...
}

//in an activity
if(!isFinishing()) {
    loadPromptInput(this...
}

请发布您的代码,您的警报对话框放在哪里了?刚刚添加了代码。它实际上是一个用户输入提示对话框,其代码写在帮助器类(myUtils.java)中。当从菜单中选择重命名选项时(从recyclerview的适配器类中膨胀),会调用它。谢谢你的回答。但是,如果activity!isFinishing()为false,那么它将不会启动。但它应该…我的困惑是,当我重新启动应用程序时(在按下backpress键后),为什么会发生这种情况。我以一种复杂的方式调用此代码。在AdapterView类中选择菜单项后,将发送一个意图,并在mainactivity中通过“edit”命令过滤该意图。这就是我制作适配器的方法(对于recyclerview)这将启动菜单布局,与包含recyclerview的Mainactivity对话。那么您使用的是哪种上下文?我想这就是问题所在。谢谢,我想您为我指出了解决方案。问题是我使用了一个intent,而不是注销它。因此,当在BackPress之后再次启动时,被销毁的活动仍然是l听它(这是我的理解),并试图从死的上下文启动一个对话。我接受你的答案,希望人们能阅读评论。