studio - Excepción ilegal de Android cuando se muestra el diálogo
show dialog box android studio (6)
El nivel superior de tu stacktrace te está diciendo lo que está mal:
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21f9ba68 V.E..... R.....ID 0,0-1136,402} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:328)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
at android.app.Dialog.dismissDialog(Dialog.java:433)
at android.app.Dialog.dismiss(Dialog.java:416)
Está llamando a despedir en un cuadro de diálogo que ya no se muestra. Como en: su Actividad / Fragmento posiblemente ya se haya destruido cuando llame a despedir (-> "no adjunto al administrador de ventanas").
[editar] Una forma de solucionar este problema es verificar la actividad.isFinishing () o fragment.isAdded ()
Tengo registro de fallos:
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21f9ba68 V.E..... R.....ID 0,0-1136,402} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:328)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
at android.app.Dialog.dismissDialog(Dialog.java:433)
at android.app.Dialog.dismiss(Dialog.java:416)
at ys.a(ConfirmationDialog.java:82)
at ys.a(ConfirmationDialog.java:76)
at **com.smarttech.kapp.SnapshotActivity.onOptionsItemSelected(SnapshotActivity.java:147)**
at android.app.Activity.onMenuItemSelected(Activity.java:3036)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:373)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1222)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:155)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:611)
at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:197)
at android.view.View.performClick(View.java:5217)
at android.view.View.onKeyUp(View.java:9663)
at android.widget.TextView.onKeyUp(TextView.java:7047)
at android.view.KeyEvent.dispatch(KeyEvent.java:3171)
at android.view.View.dispatchKeyEvent(View.java:8876)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1695)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2671)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1787)
at android.app.Activity.dispatchKeyEvent(Activity.java:2837)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2549)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4661)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4616)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4303)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4201)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4360)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4201)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4174)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4227)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4193)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4336)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4500)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2607)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2201)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2192)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2584)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Este es el siguiente código para mostrar el diálogo en la actividad de instantáneas:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.snapshot_delete:
Log.d(TAG, "delete snapshot");
**delete();**
return true;
case R.id.snapshot_share:
export();
return true;
}
return super.onOptionsItemSelected(item);
}
private void delete() {
Log.d(TAG, "Delete snapshot");
final int index = pager.getCurrentItem();
ConfirmationDialog.prompt(this, R.string.delete_snapshot, R.string.delete_snapshot_confirmation, R.string.delete, android.R.string.cancel, new Runnable() {
@Override
public void run() {
snapshots.get(index).delete();
loadSnapshots();
}
});
}
Este accidente es muy difícil de reproducir y es toda la información que tengo. ¿Cuál es la razón de esta excepción? ¿Y cómo se puede arreglar? Creo que la razón es hilo en el diálogo, pero no estoy seguro
public static void prompt(final Context context, int titleResourceId, int questionResourceId, int positiveButton, int negativeButton, final Runnable confirmedRunnable, final Runnable cancelledRunnable) {
closeDialog();
DialogInterface.OnClickListener confirmed = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
currentDialog = null;
confirmedRunnable.run();
}
};
DialogInterface.OnClickListener cancelled = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
currentDialog = null;
if (cancelledRunnable != null) {
cancelledRunnable.run();
}
};
};
currentDialog = new AlertDialog.Builder(context).setTitle(titleResourceId).setMessage(questionResourceId).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(positiveButton, confirmed)
.setNegativeButton(negativeButton, cancelled).show();
currentDialog.setCancelable(cancelled == null);
currentDialog.setCanceledOnTouchOutside(cancelled == null);
}
Esta es la implementación promt
No veo ninguna razón por la que toda la aplicación deba bloquearse por algo como esto. Me parece que una excepción en este punto debe ser el resultado de que la actividad ya haya terminado o algo así. En cualquier caso, supongo que el usuario ya no está mirando el cuadro de diálogo, así que he creado una sencilla utilidad para cerrar los cuadros de diálogo en silencio.
import android.app.Dialog;
import android.util.Log;
import java.io.PrintWriter;
import java.io.StringWriter;
public class DialogUtil {
public static final String TAG = "DialogUtil";
public static void safeDismiss(Dialog dialog) {
if (dialog != null && dialog.isShowing()) {
try {
dialog.dismiss();
} catch (RuntimeException ex) {
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
Log.e(TAG, sw.toString());
}
}
}
}
Por favor despida de la siguiente manera
if ((alertDialog != null) && alertDialog.isShowing())
{
alertDialog.dismiss();
}
Sugiero, también debe comprobar si la actividad no es nula.
if (activity != null && progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
Tengo el mismo problema y soluciono este problema comprobando:
if (alertDialog != null && alertDialog .isShowing() && !this.isFinishing())
{
alertDialog .dismiss();
}
Una forma sencilla de descartar de forma segura su cuadro de diálogo es verificar si la vista que contiene el cuadro de diálogo se muestra actualmente antes de intentar descartarlo. Esto se ve como
if (view.isShown()) {
dialog.dismiss()
}