错误的 window 标记,您无法在创建 Activity 之前或隐藏之后显示对话框
Bad window token, you cannot show a dialog before an Activity is created or after it's hidden
我在我的应用程序中使用 AppIntro library。
它有 3 张幻灯片。当显示第三张幻灯片时,我想问用户一些事情。为此,我使用 material dialogs by afollestad。
我在 AppIntro Activity 中的代码如下所示:
@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();
}
}
运行 App 当我滑动到第三张幻灯片时出现以下问题:
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.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)
我不是很明白这个问题。
因为 AppIntro Activity 已经加载,我希望它在显示特定片段时显示一个对话框。
如何实现在显示特定幻灯片时显示对话框?
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
我想你需要在这里传递 Activity
实例,而不是应用程序上下文。
如果此错误发生在 activity 内部,请使用 "this" 而不是 "getApplicationContext()"。
mProgress = new MaterialDialog.Builder(this)
使用
MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)
不要使用 getApplicationContext()。
这可以通过确认当前 Activity
hasWindowFocus
来解决,因为当您在片段中获取上下文时,而不是确切的 Activity 它可能没有 windowFocus
:
if (((Activity) mContext).hasWindowFocus()) {
mDialog.show();
}
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();
}
});
}
}
这是我现在正在使用的,它正在运行
希望对您有所帮助:)
我在我的应用程序中使用 AppIntro library。
它有 3 张幻灯片。当显示第三张幻灯片时,我想问用户一些事情。为此,我使用 material dialogs by afollestad。
我在 AppIntro Activity 中的代码如下所示:
@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();
}
}
运行 App 当我滑动到第三张幻灯片时出现以下问题:
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.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)
我不是很明白这个问题。 因为 AppIntro Activity 已经加载,我希望它在显示特定片段时显示一个对话框。
如何实现在显示特定幻灯片时显示对话框?
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
我想你需要在这里传递 Activity
实例,而不是应用程序上下文。
如果此错误发生在 activity 内部,请使用 "this" 而不是 "getApplicationContext()"。
mProgress = new MaterialDialog.Builder(this)
使用
MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)
不要使用 getApplicationContext()。
这可以通过确认当前 Activity
hasWindowFocus
来解决,因为当您在片段中获取上下文时,而不是确切的 Activity 它可能没有 windowFocus
:
if (((Activity) mContext).hasWindowFocus()) {
mDialog.show();
}
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();
}
});
}
}
这是我现在正在使用的,它正在运行
希望对您有所帮助:)