Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.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中扩展应用程序的类中显示对话框?_Android_Android Dialog - Fatal编程技术网

如何从android中扩展应用程序的类中显示对话框?

如何从android中扩展应用程序的类中显示对话框?,android,android-dialog,Android,Android Dialog,我想在特定条件后显示一个对话框,但对于现在的演示,我想从扩展应用程序的类中显示一个对话框。 这是我的密码 public class ControlApplication extends Application { @Override { super.onCreate(); final Dialog dialog = new Dialog ( getApplicationContext() ); dialog.setTitle("zakasssssssss

我想在特定条件后显示一个对话框,但对于现在的演示,我想从扩展应用程序的类中显示一个对话框。 这是我的密码

public class ControlApplication extends Application
{
    @Override
    {
    super.onCreate();
    final Dialog dialog = new Dialog ( getApplicationContext() ); 
    dialog.setTitle("zakasssssssssssssssssss");
    dialog.setCancelable(false);
    dialog.show();
}
}

但是在dialog.show()中,我得到了如下错误

Attempted to add window with non-application token WindowToken{4067a268 token=null}.  Aborting.
D/AndroidRuntime( 1923): Shutting down VM
W/dalvikvm( 1923): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 1923): FATAL EXCEPTION: main
E/AndroidRuntime( 1923): java.lang.RuntimeException: Unable to create application 
com.test.shrenik.ControlApplication: android.view.WindowManager$BadTokenException: 
Unable to add window -- token null is not for an application
E/AndroidRuntime( 1923):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3275)
E/AndroidRuntime( 1923):    at android.app.ActivityThread.access$2200(ActivityThread.java:117)
E/AndroidRuntime( 1923):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:969)
E/AndroidRuntime( 1923):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1923):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1923):    at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime( 1923):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1923):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 1923):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime( 1923):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime( 1923):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1923): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 1923):    at android.view.ViewRoot.setView(ViewRoot.java:531)
E/AndroidRuntime( 1923):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 1923):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 1923):    at android.app.Dialog.show(Dialog.java:241)
E/AndroidRuntime( 1923):    at com.andromeda.ui.pandora.ControlApplication.onCreate(ControlApplication.java:38)
E/AndroidRuntime( 1923):    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
E/AndroidRuntime( 1923):    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
E/AndroidRuntime( 1923):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3272)
E/AndroidRuntime( 1923):    ... 10 more

有人能提出任何解决方案吗?

您不能使用应用程序[或服务]上下文。如果您确实想从应用程序中显示diallog,则必须向其传递活动上下文。您也可以存储活动上下文,但我不建议这样做。活动上下文在完成时无效,因此您将中断程序。正如@LeoLink所说,直接从您的活动中调用它即可

例如编辑

class MyDialog {
    public Dialog show(Context context) {
        Dialog d = new Dialog(context);
        d.setTitle("I'm a dialog");
        d.setMessage("I'm a message");
        return d.show();
    }
}

应用程序类用于保存活动可以使用的数据,而不是与UI交互。从要在其中显示的活动中显示对话框

编辑:如果要从多个活动调用代码,可以为这些活动创建一个超类,其中包含对话框中的代码。然后在要显示对话框的所有活动中扩展此超类,并从那里调用它。

您的程序可能会按照您的意愿运行** **请记住,您需要考虑其行为的后果

public class MyApplication extends Application {
        /** 
        * show example alertdialog on context -method could be moved to other class 
        * (eg. MyClass) or marked as static & used by MyClas.showAlertDialog(Context)
        * context is obtained via getApplicationContext() 
        */
        public void showAlertDialog(Context context) {
            /** define onClickListener for dialog */
            DialogInterface.OnClickListener listener 
                  = new   DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                // do some stuff eg: context.onCreate(super)
                }
            };

            /** create builder for dialog */
            AlertDialog.Builder builder = new AlertDialog.Builder(context)
                .setCancelable(false)
                .setMessage("Messag...")
                .setTitle("Title")
                .setPositiveButton("OK", listener);
            /** create dialog & set builder on it */
            Dialog dialog = builder.create();
            /** this required special permission but u can use aplication context */ 
            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            /** show dialog */
            dialog.show();
        }

        @Override
        public void onCreate() {
            showAlertDialog(getApplicationContext());
        }
}
我们的进口:

import android.app.AlertDialog;
import android.app.Application;
import android.app.Dialog; 
import android.content.Context;
import android.content.DialogInterface; 
import android.view.WindowManager;
伊迪丝:

不能通过非活动或服务的上下文**显示应用程序窗口/对话框。尝试传递有效的活动引用

**通过在调用dialog.show()之前添加,可以使用应用程序上下文创建对话框

Dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

- but this requires permission:  

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Dialog.getWindow().setType(WindowManager.LayoutParams.TYPE\系统\警报);
-但这需要许可:
参考:


但是在同一个类中,我可以显示Toast,那么为什么我不能显示对话框?我有很多活动,在特定条件下,我想显示该对话框,因此在每个活动中编写相同的代码是没有意义的。Toast更多的是一种设备功能,而不是应用程序功能。@shankey您不必编写相同的代码。参考我的更新如果您真的想在应用程序中使用该代码(我仍然认为这是一种糟糕的做法),那么您应该将该活动传递给该方法。然后将活动用作对话框的上下文,它将起作用。但是我想要的是一个用于所有活动的超类,带有特定的代码(包括对话框代码),我有很多活动,在特定的条件下,我想显示对话框,如何获取活动上下文并将其传递给ControlApplication类?如果你执意要这样做,我不推荐这样做,然后在应用程序中放置一个活动变量。然后调用
Context.getApplicationContext()
并将其强制转换为特定的应用程序,并调用一个方法通过该方法传递活动上下文。就像一个普通的二传手。但是,如果您这样做,请不要依赖它,不要忘记每次活动更改时都必须更改它,否则它将无法工作。这需要特殊权限。这对我来说不是解决方案。你只是在代码中添加了一条注释,当你想在活动之外显示对话框时,你仍然需要该权限。@rekire-请参阅编辑-当你告诉你想在哪里显示dialogTYPE\u SYSTEM\u ALERT时,给你一个解决方案会很简单!!为什么不从要显示对话框的活动中调用dialog.show()?我有许多活动,在特定条件下,我想显示该对话框,因此在每个活动中编写相同的代码是没有意义的。因此,可以将“dialog”变量设为“ControlApplication”类的属性,然后为它写一个getter。然后,您可以在“ControlApplication”中设置一些影响“dialog”的条件,然后在每个活动中调用如下内容:((应用程序)getApplicationContext()).getDialog().show()。希望能有帮助:)@LeoLink这行不通。您不能使用应用程序上下文创建对话框。啊,我忘记了,但是为什么要在调用活动的应用程序的onCreate时显示对话框呢?。如果不想多次编写代码段,可以创建函数并向其传递参数。