13

クリックするとButton、が表示されますDialog。すべてが魅力のように機能しますが、ボタンをダブルクリックするか、ボタンをすばやくクリックすると、Dialog2〜3回開きます。を閉じるには、戻るボタンを2回または3回クリックする必要がありますDialog

SOで関連する質問を検索しましたが、ほとんどの回答は、ボタンを無効にするか、変数を使用してtrueとfalseに設定することを提案しています。これは、私の要件ではありません。

誰かがこの問題を解決する方法を知っているなら、私を助けてください。

私が使用したコード

// Delete item on click of delete button
holder.butDelete.setOnClickListener(new OnClickListener() {         
@Override
    public void onClick(View v) {
        Dialog passwordDialog = new Dialog(SettingsActivity.this);      
        passwordDialog.show();
    }
});
4

10 に答える 10

11

あなたはあなたDialogがすでに表示されているかどうかを確認する必要があります:

Dialog passwordDialog = new Dialog(SettingsActivity.this);
holder.butDelete.setOnClickListener(new OnClickListener() {           
    @Override
    public void onClick(View v) {                  
        if(!passwordDialog.isShowing()) {
            passwordDialog.show();
        }
    }
});

アップデート:

これがあなたのケースでうまくいかない場合は、あなたの活動でグローバルに宣言してください:

Dialog passwordDialog = null;

そしてButtonのクリックで:

holder.butDelete.setOnClickListener(new OnClickListener() {           
    @Override
    public void onClick(View v) {                  
        if(passwordDialog == null) {
            passwordDialog = new Dialog(SettingsActivity.this); 
            passwordDialog.show(); 
        }
    }
});
于 2012-09-11T12:53:11.293 に答える
9

グローバルに宣言:

private Boolean dialogShownOnce = false;
private mDialog dia;

あなたdialog.show();が呼ばれる場所:

dia = new mDialog(getContext());

if (!dia.isShowing() && !dialogShownOnce) {
    dia.show();
    dialogShownOnce = true;
}

dia.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        dialogShownOnce = false;
    }
});

mDialogはグローバルである必要はありませんが、mDialog.dismiss()ローカルスコープ外のインターフェイスを呼び出していました。

まだ使用していますがBoolean、なぜ使用できないのかわかりません。

于 2015-10-19T10:10:00.800 に答える
4

このコードをダイアログを表示する場所に配置すると、タグ名に基づいてダイアログが存在するかどうかがチェックされます。

FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prevFragment = getFragmentManager().findFragmentByTag("dialog");
if (prevFragment != null) {
    return;
}

MyDialog dialog = MyDialog.newInstance();
dialog.show(ft, "dialog");
于 2017-05-30T06:39:23.123 に答える
1

メソッドを呼び出すとき、 trueを返すのにshow()少し時間がかかります。 最初は、ダイアログの入り口のアニメーションがまだ終了していないため、falseを返します。私の解決策は、ダイアログクラスの新しい実装を構築することです。isShowing()

public class ObedientDialog extends Dialog{

    private boolean showing;

    public ObedientDialog(Context context) {

        setOnCancelListener(new OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                showing=false;
            }});

        setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                showing=false;
            }});
    }

    @Override
    public void show() {
        if (!showing) super.show();
        showing=true;
    }

    public boolean isShowing(){
        return showing;
    }
}
于 2018-05-24T16:20:26.797 に答える
1

私は同じ問題に直面しました。それが私がそれを修正した方法です

private AlertDialog.Builder alertDialogBuilder;
private AlertDialog alertDialog;

上記の変数をグローバルに宣言します

alertDialogBuilder = new AlertDialog.Builder(this);

次に、上記のように、OnCreateメソッドでalertDialogBu​​ilderを作成します

    private void AlertDialogMessage(){
        alertDialogBuilder.setMessage("Internet disconnected!");
        alertDialogBuilder.setCancelable(true);
        alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alertDialog = alertDialogBuilder.create();
   }

この関数でアラートダイアログを作成しました。OnCreateメソッドでこの関数を呼び出します。alertDialogBu​​ilder作成ステートメント
の後に呼び出す必要があります。その後、ボタンOnClickListenerにそれを以下のコードに入れます。

   if (!alertDialog.isShowing()){
        alertDialog.show();
   }

それでおしまい。それは私の問題を修正しました。うまくいけば、それはあなたも修正するでしょう。

于 2020-09-05T12:38:19.067 に答える
0

ボタンをクリックしたら無効にし、ダイアログをキャンセルしたら再度有効にします。以下のように

 holder.butDelete.setOnClickListener(new OnClickListener()
            {           
                @Override
                public void onClick(View v)
                {   
                    holder.butDelete.setEnabled(false);
                    Dialog passwordDialog = new Dialog(SettingsActivity.this);      
                    passwordDialog.show();
                }
            });

それが機能しなかった場合は、ブール変数を1つ取得し、それを使用してダイアログを表示およびキャンセルする必要があります。

于 2012-09-11T12:47:34.127 に答える
0

以下に示すこのコードを使用することもできます

 private long mLastClickTime = 0;

public boolean isSingleClick() {
            if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
                return false;
            }
            mLastClickTime = SystemClock.elapsedRealtime();
            return true;
        }

    if(isSingleClick){
    openDialog();
    }
于 2020-01-02T09:59:49.473 に答える
-1

おそらく、onCreateDialog()メソッドをオーバーライドしてからを呼び出すことにより、アクティビティによってダイアログを管理する必要がありますshowDialog()。それはあなたの問題を解決するでしょう。

http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int、android.os.Bundle)を参照してください

アクティビティによって管理(保存および復元)されるダイアログを作成するためのコールバック。デフォルトの実装では、互換性のためにonCreateDialog(int)が呼び出されます。HONEYCOMB以降をターゲットにしている場合は、代わりにDialogFragmentを使用することを検討してください。

例:

public class TestActivity extends Activity {

private static final int TEST_DIALOG_ID = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    showDialog(TEST_DIALOG_ID);
}

@Override
protected Dialog onCreateDialog(int id) {
    if(id == TEST_DIALOG_ID) {
        Dialog passwordDialog = new Dialog(this);      
        return passwordDialog;
    }
    return super.onCreateDialog(id);
}

}
于 2012-09-11T12:50:21.267 に答える
-1

これを試して。

手順1.ダイアログオブジェクトをインスタンス変数またはグローバル変数として宣言します

  private MediaPlayerDialog dialog;

ステップ2.今度はあなたのbttonクリックに以下のコードを入れてください。

 if (dialog == null || (!dialog.isVisible())) {
        dialog = new MediaPlayerDialog();
        dialog.setData(songListDatas, selectPosition);
        dialog.show(getSupportFragmentManager(), dialog.getClass().getName().toString());
    }

注: MediaPlayer私の習慣DialogFragmentですが、要件に応じて変更できます。

幸運を祈ります

于 2016-05-06T09:46:57.197 に答える
-2

このようにしてみてください...

Dialog passwordDialog = new Dialog(SettingsActivity.this);


holder.butDelete.setOnClickListener(new OnClickListener()
{           
            @Override
            public void onClick(View v)
            {                         
                if(!passwordDialog.isShowing()) {   
                   passwordDialog.show();
                }
            }
});
于 2012-09-11T12:54:43.793 に答える