Frage Wie man Dialogfeld von der Klasse zeigt, die Anwendung in Android verlängert?


Ich möchte nach einer bestimmten Bedingung ein Dialogfeld anzeigen, aber zur Demo möchte ich jetzt ein Dialogfeld aus der Klasse anzeigen, die die Anwendung erweitert. Hier ist mein Code

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

}

aber bei der dialog.show () bekomme ich fehler wie

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

Kann jemand irgendeine Lösung vorschlagen?


14
2017-12-20 15:41


Ursprung


Antworten:


Ihr Programm kann sich wie gewünscht verhalten! **

 ** Denken Sie daran, dass Sie über die Konsequenzen seiner Handlungen nachdenken müssen.

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());
        }
}

Importe für above:

import android.app.AlertDialog;
import android.app.Application;
import android.app.Dialog; 
import android.content.Context;
import android.content.DialogInterface; 
import android.view.WindowManager;

edity:

Sie können kein Anwendungsfenster / -dialog über einen Kontext anzeigen, der keine Aktivität oder kein Service ist. Übergeben Sie eine gültige Aktivitätsreferenz

** Sie können Anwendungskontext verwenden, um einen Dialog durch Hinzufügen zu erstellen vor Aufruf von Dialog.show ();

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

- but this requires permission:  

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Ref:


6
2018-04-19 00:10



Sie können keinen Anwendungskontext verwenden. Wenn Sie wirklich Diallog aus einer Anwendung anzeigen möchten, müssen Sie ihm einen Aktivitätskontext übergeben. Sie können den Aktivitätskontext auch speichern, aber ich machen nicht empfehle das. Der Aktivitätskontext wird beim Beenden ungültig, so dass Sie Ihr Programm unterbrechen. Wie @Leolink sagte, rufen Sie es einfach direkt von Ihrer Aktivität an.

EDIT für Beispiel

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();
    }
}

2
2017-12-20 15:49



Die Application-Klasse dient dazu, Daten zu speichern, die von Ihren Aktivitäten verwendet werden können, um nicht mit der Benutzeroberfläche zu interagieren. Zeigen Sie den Dialog von der Aktivität an, in der er angezeigt werden soll.

BEARBEITEN: Wenn Sie den Code aus mehreren Aktivitäten aufrufen möchten, können Sie eine Oberklasse für diese Aktivitäten verwenden, die den Code mit dem Dialog enthalten. Erweitern Sie dann diese Oberklasse in allen Aktivitäten, die Sie anzeigen möchten, und rufen Sie sie von dort auf.


1
2017-12-20 15:50