Как показать диалоговое окно из класса, который расширяет приложение в Android? - PullRequest
15 голосов
/ 20 декабря 2011

Я хочу показать диалоговое окно после определенного условия, но для демонстрации прямо сейчас я хочу показать диалоговое окно из класса, который расширяет приложение.вот мой код

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

Кто-нибудь может предложить какое-либо решение?

Ответы [ 3 ]

7 голосов
/ 19 апреля 2015

Ваша программа может вести себя как вы хотите! **

** Просто помните, что вам нужно подумать о последствиях его действий.

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

импорт для abowe:

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:

Вы не можете ** отобразить окно / диалог приложения через Контекст, который не является Деятельностью или Службой. Попробуйте передать действительную ссылку на активность

** вы можете использовать контекст приложения для создания диалога, добавив перед вызовом Dialog.show ();

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

- but this requires permission:  

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

Ссылка:

2 голосов
/ 20 декабря 2011

Вы не можете использовать контекст приложения [или службы]. Если вы действительно хотите показать свой диалог из приложения, вам нужно будет передать ему контекст Activity. Вы также можете сохранить контекст Activity, но я do not рекомендую. Контекст действия аннулируется по окончании, поэтому вы нарушите свою программу. Как сказал @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();
    }
}
1 голос
/ 20 декабря 2011

Класс Application предназначен для хранения данных, которые могут использоваться вашими действиями, а не для взаимодействия с пользовательским интерфейсом.Отобразите диалоговое окно из действия, в котором вы хотите его отобразить.

РЕДАКТИРОВАТЬ: Если вы хотите вызвать код из нескольких действий, вы можете иметь суперкласс для этих действий, который содержит кодс диалогом.Затем расширьте этот суперкласс во всех действиях, которые вы хотите отобразить в диалоговом окне, и вызовите его оттуда.

...