studio - set dialog android
La actividad ha filtrado la ventana en el método alertDialog show() (6)
Recibo un error de fuga de ventana en el tiempo de ejecución debido al uso de un AlertDialog.
He señalado la línea de error en el siguiente código:
Stacktrace:
08-18 02:48:04.489 28893-28893/? E/WindowManager﹕ Activity com.ms.ha.fragment.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
android.view.WindowLeaked: Activity com.ms.ha.fragment.FirstActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52e58540 V.E..... R.....ID 0,0-1026,585} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.Dialog.show(Dialog.java:281)
at com.ms.ha.fragment.TourGuideLoadURLFragment$WebAppInterface.moveToNextScreen(TourGuideLoadURLFragment.java:116)
at android.webkit.WebViewCore.nativeMouseClick(Native Method)
at android.webkit.WebViewCore.nativeMouseClick(Native Method)
at android.webkit.WebViewCore.access$6800(WebViewCore.java:59)
at android.webkit.WebViewCore$EventHub.dispatchWebKitEvent(WebViewCore.java:1793)
at android.webkit.WebViewInputDispatcher.dispatchWebKitEvent(WebViewInputDispatcher.java:689)
at android.webkit.WebViewInputDispatcher.dispatchWebKitEvents(WebViewInputDispatcher.java:639)
at android.webkit.WebViewInputDispatcher.access$800(WebViewInputDispatcher.java:78)
at android.webkit.WebViewInputDispatcher$WebKitHandler.handleMessage(WebViewInputDispatcher.java:1153)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:814)
at java.lang.Thread.run(Thread.java:841)
FirstActivity.java:
public class FirstActivity extends FragmentActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_tour_guide_web);
.......
.......
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
}
public class WebAppInterface {
Context mContext;
/**
* Instantiate the interface and set the context
*/
WebAppInterface(Context c) {
mContext = c;
}
/**
* Intent - Move to next screen
*/
@JavascriptInterface
public void moveToNextScreen() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set title
alertDialogBuilder.setTitle("Your Title");
// set dialog message
alertDialogBuilder
.setMessage("Click yes!")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(i);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// if this button is clicked, just close
// the dialog box and do nothing
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show(); --->leak window error
}
}
}
No sé cómo resolver este problema.
Debes tener que cerrar / cancelar tu diálogo una vez que la actividad esté terminando. Ocurre generalmente si los diálogos no se descartan antes de que finalice la actividad.
Descarte el alertDialog en el método onPause (). es decir, llamada alertDialog.dismiss ()
Nota: las excepciones de WindowLeaked se producen generalmente si los cuadros de diálogo no se cierran antes de que termine la actividad.
No sé esto ayuda, pero a mí los problemas causaban multidex. En build.gradle
multiDexEnabled false
Recibirá un error porque ProgressDialog
está ejecutando mientras se destruye su Activity
. Debes descartar el diálogo antes de comenzar una nueva Activity
.
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
}
});
¡Espero que ayude!
También puede obtener una excepción de WindowLeaked si no está en el hilo de la IU cuando intenta mostrar el cuadro de diálogo. Solución fácil:
this.runOnUiThread(new Runnable() {
@Override
public void run() {
// show dialog here
}
});
Verifique en su manifiesto si ha establecido permisos de internet:
<uses-permission android:name="android.permission.INTERNET" />