问题
I am using an AppIntro library in my app.
It has 3 slides. I want to ask the user something when the third slide is shown. To achieve that I am using material dialogs by afollestad.
My code in the AppIntro Activity looks like that:
@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();
}
}
Running the App I get the following issue when I slide to the third slide:
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)
I do not really understand the problem. Because the AppIntro Activity is already loaded and I expect it to show a dialog when a specific fragment is shown.
How can I achieve to show a dialog when a specific slide is shown?
回答1:
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
I suppose you need to pass the Activity
instance here, not the application context.
回答2:
This can be resolved by confirming that current Activity
hasWindowFocus
because when you get the context in the fragment, instead of exactly which Activity it is, it might not have windowFocus
:
if (((Activity) mContext).hasWindowFocus()) {
mDialog.show();
}
回答3:
use
MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)
do not use getApplicationContext().
回答4:
Use "this" instead of "getApplicationContext()" if this error happening even inside the activity.
mProgress = new MaterialDialog.Builder(this)
回答5:
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();
}
});
}
}
Here is what i'm using right now, and it's working
Hope it helps :)
来源:https://stackoverflow.com/questions/34481525/bad-window-token-you-cannot-show-a-dialog-before-an-activity-is-created-or-afte