android - tipos - Símbolo de ventana incorrecto, no se puede mostrar un cuadro de diálogo antes de crear una actividad o después de que esté oculta
tipos de dialogos en android studio (5)
Estoy usando una biblioteca de AppIntro en mi aplicación.
Tiene 3 diapositivas. Quiero preguntar algo al usuario cuando se muestre la tercera diapositiva. Para lograr eso estoy usando diálogos materiales por afollestad .
Mi código en la Actividad de AppIntro se ve así:
@Override
public void onNextPressed() {
if(this.pager.getCurrentItem() == 2) {
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
.title("QR Code scannen")
.content("Möchtest du den QR Code scannen oder selbst eingeben?")
.positiveText("eingeben")
.negativeText("scannen")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = new Intent(getApplicationContext(), RegistrationActivity.class);
startActivity(intent);
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// TODO
}
})
.show();
}
}
Al ejecutar la aplicación, aparece el siguiente problema cuando me desplazo a la tercera diapositiva:
com.afollestad.materialdialogs.MaterialDialog$DialogException:
Bad window token, you cannot show a dialog before an Activity is created or after it''s hidden.
at com.afollestad.materialdialogs.MaterialDialog.show(MaterialDialog.java:1328)
at com.afollestad.materialdialogs.MaterialDialog$Builder.show(MaterialDialog.java:1317)
at com.ads.adstimer.fragment.Registration.RegistrationActivity.onNextPressed(RegistrationActivity.java:64)
at com.github.paolorotolo.appintro.AppIntro$2.onClick(AppIntro.java:118)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Realmente no entiendo el problema. Porque la Actividad de AppIntro ya está cargada y espero que muestre un diálogo cuando se muestre un fragmento específico.
¿Cómo puedo lograr mostrar un diálogo cuando se muestra una diapositiva específica?
Esto puede resolverse confirmando que la Activity
actual hasWindowFocus
porque cuando obtiene el contexto en el fragmento, en lugar de exactamente qué actividad es, puede que no tenga windowFocus
:
if (((Activity) mContext).hasWindowFocus()) {
mDialog.show();
}
Use "this" en lugar de "getApplicationContext ()" si este error ocurre incluso dentro de la actividad.
mProgress = new MaterialDialog.Builder(this)
utilizar
MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)
no use getApplicationContext ().
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
Supongo que debe pasar la instancia de la Activity
aquí, no el contexto de la aplicación.
public class MainActivity extend Activity{
MaterialDialog dialog;
protected void onCreate(Bundle savedInstanceState) {
dialog = new MaterialDialog.Builder(OrderInfoActivity.this)
.title("Reject?")
.content("Are you reject this order?")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog dialog, DialogAction which) {
Toast.makeText(OrderInfoActivity.this, "Option1", Toast.LENGTH_SHORT).show();
}
})
.onNeutral(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog dialog, DialogAction which) {
Toast.makeText(OrderInfoActivity.this, "Option 2", Toast.LENGTH_SHORT).show();
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(MaterialDialog dialog, DialogAction which) {
Toast.makeText(OrderInfoActivity.this, "Option 3", Toast.LENGTH_SHORT).show();
}
}).build();
accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.show();
}
});
}
}
Esto es lo que estoy usando en este momento, y está funcionando
Espero eso ayude :)