I want show a dialog box after specific condition , but for demo right now I want show a Dialog Box from the class which extends Application . here is my code
public class ControlApplication extends Application
{
@Override
{
super.onCreate();
final Dialog dialog = new Dialog ( getApplicationContext() );
dialog.setTitle("zakasssssssssssssssssss");
dialog.setCancelable(false);
dialog.show();
}
}
but at the dialog.show() I am getting error like
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
can anybody suggest any solution ?
Afaik there is no way to display a Dialog w/o being the active foreground app.
Showing the DialogFragment It is not necessary to manually create a FragmentTransaction to display your DialogFragment . Instead, use the show() method to display your dialog. You can pass a reference to a FragmentManager and a String to use as a FragmentTransaction tag.
** Just remember that you need to think about the consequences of its actions.
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());
}
}
imports for 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:
You cannot **display an application window/dialog through a Context that is not an Activity or Service. Try passing a valid activity reference
** u can use application context to create dialog by adding before call to Dialog.show();
Dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- but this requires permission:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Ref:
You can't use an application [or service] context. If you really want to show you diallog from an application, you will have to pass an Activity context to it. You could also store the Activity context, but I do not recommend that. The activity context is voided on finish, so you will break your program. As @LeoLink said, just call it directly from your Activity.
EDIT For Example
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();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With