Диалоговое окно предупреждения Android не работает

#android #android-alertdialog

#Android #android-alertdialog

Вопрос:

 AlertDialog.Builder builder;
    AlertDialog alertDialog;

    Context mContext = getApplicationContext();
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.dialoglayout,
                                   (ViewGroup) findViewById(R.id.layout_root));

    TextView text = (TextView) layout.findViewById(R.id.text);
    text.setText("Hello, this is a custom dialog!");
    ImageView image = (ImageView) layout.findViewById(R.id.image);
    image.setImageResource(R.drawable.icon);

    builder = new AlertDialog.Builder(mContext);
    builder.setView(layout);
    alertDialog = builder.create();

    alertDialog.show();
  

Кто-нибудь может рассказать мне о проблеме с этим кодом.Это приводит к следующему исключению:

11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main 11-06 11:44:20.572: ОШИБКА /AndroidRuntime(339): исключение java.lang.RuntimeException: Не удается запустить activity ComponentInfo{com.andoroid.dialog/com.andoroid.dialog.AlertDialogTestActivity}: android.view.WindowManager $ BadTokenException: не удается добавить окно — токен null не для приложения 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): на android.app.ActivityThread.access $ 2300 (ActivityThread.java:125) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.app.ActivityThread $H.handleMessage(ActivityThread.java:2033) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.os.Handler.DispatchMessage (обработчик.java:99) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.os.Looper.loop (Looper.java:123) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.app.ActivityThread.main(ActivityThread.java: 4627) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в java.lang.reflect.Метод.invokeNative (собственный метод) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в java.lang.reflect.Метод.invoke(Метод.java:521) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в dalvik.system.NativeStart.main (собственный метод) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): Вызвано: android.view.WindowManager $ BadTokenException: невозможно добавить окно — токен null не для приложения 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.view.ViewRoot.setView (ViewRoot.java:509) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.app.Dialog.show(Dialog.java: 241) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в com.andoroid.dialog.AlertDialogTestActivity.CreateDialog(AlertDialogTestActivity.java:48) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в com.andoroid.dialog.AlertDialogTestActivity.onCreate(Предупреждающий dialogtestactivity.java:22) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime(339): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 11-06 11:44:20.572: ОШИБКА / AndroidRuntime (339): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2627)

Ответ №1:

Моя идея:

1) используйте текущую активность вместо mContext = getApplicationContext(); , например:

 LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
  

это относится к вашей деятельности, если вы пишете в ней код.

2) очистите свой проект

Комментарии:

1. большое спасибо, приятель, это сработало!!! можете ли вы сказать мне причину, по которой было неправильно использовать ApplicationContext.

2. общедоступный контекст getApplicationContext () Поскольку: уровень API 1 Возвращает контекст единого глобального объекта приложения текущего процесса. Обычно это следует использовать, только если вам нужен контекст, жизненный цикл которого отделен от текущего контекста, который привязан к времени жизни процесса, а не текущего компонента.

Ответ №2:

Более того, если вам нужен пользовательский диалог, нет необходимости раздувать представления и использовать AlertDialog.Конструктор.

Вместо этого вы можете сделать это следующим образом:

 Dialog customDialog = new Dialog(YourActivity.this);
customDialog.setContentView(R.layout.dialoglayout);
TextView text = (TextView) customDialog.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) customDialog.findViewById(R.id.image);
image.setImageResource(R.drawable.icon);

customDialog.show();
  

Вы можете увидеть пример этого в руководстве по разработке Android:
http://developer.android.com/guide/topics/ui/dialogs.html#CustomDialog