J'utilise une bibliothèque AppIntro dans mon application.
Il a 3 diapositives. Je veux demander quelque chose à l'utilisateur lorsque la troisième diapositive est affichée. Pour y parvenir, j'utilise dialogues matériels par afollestad .
Mon code dans l'activité AppIntro ressemble à ça:
@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();
}
}
En exécutant l'application, j'obtiens le problème suivant lorsque je passe à la troisième diapositive:
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)
Je ne comprends pas vraiment le problème. Parce que l'activité AppIntro est déjà chargée et je m'attends à ce qu'elle affiche une boîte de dialogue lorsqu'un fragment spécifique est affiché.
Comment puis-je réaliser pour afficher une boîte de dialogue lorsqu'une diapositive spécifique est affichée?
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
Je suppose que vous devez passer l'instance Activity
ici, pas le contexte de l'application.
Cela peut être résolu en confirmant que le courant Activity
hasWindowFocus
parce que lorsque vous obtenez le contexte dans le fragment, au lieu de quelle activité il s'agit, il peut ne pas avoir windowFocus
:
if (((Activity) mContext).hasWindowFocus()) {
mDialog.show();
}
utilisation
MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)
n'utilisez pas getApplicationContext ().
Utilisez "ceci" au lieu de "getApplicationContext ()" si cette erreur se produit même à l'intérieur de l'activité.
mProgress = new MaterialDialog.Builder(this)
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();
}
});
}
}
Voici ce que j'utilise en ce moment, et ça marche
J'espère que cela aide :)