web-dev-qa-db-ja.com

不正なウィンドウトークン。アクティビティが作成される前または非表示になった後にダイアログを表示できません

アプリで AppIntroライブラリ を使用しています。

3つのスライドがあります。 3番目のスライドが表示されたときにユーザーに何かを尋ねたい。それを達成するために、私は afollestadによるマテリアルダイアログ を使用しています。

AppIntroアクティビティのコードは次のようになります。

@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();
        }
    } 

アプリを実行すると、3番目のスライドにスライドすると次の問題が発生します。

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)

私は本当に問題を理解していません。 AppIntroアクティビティは既にロードされており、特定のフラグメントが表示されたときにダイアログが表示されると予想されるためです。

特定のスライドが表示されているときにダイアログを表示するにはどうすればよいですか?

28
jublikon
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())

ここでは、アプリケーションコンテキストではなく、Activityインスタンスを渡す必要があると思います。

53
aga

これは、現在のActivityhasWindowFocusを確認することで解決できます。これは、フラグメントのコンテキストを取得するときに、正確にどのActivityであるかではなく、windowFocusを持たない可能性があるためです:

if (((Activity) mContext).hasWindowFocus()) {
        mDialog.show();
}
12
blueware

使用する

 MaterialDialog dialog = new MaterialDialog.Builder(YourActivityName.class)

getApplicationContext()を使用しないでください。

8
Rashid

このエラーがアクティビティ内でも発生する場合、「getApplicationContext()」の代わりに「this」を使用します。

    mProgress = new MaterialDialog.Builder(this)
4
Muneef M
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();
            }
        });
    }
}

ここに私が今使っているものがあり、それは機能しています

それが役に立てば幸い :)

1
Anonymous-E