Диалог открывается дважды при быстром нажатии кнопки

У меня есть Button, который при нажатии отображает a Dialog. Все работает как шарм, но если я дважды нажимаю кнопку или быстро нажимаю кнопку, Dialog открывается два или три раза. Я должен нажать кнопку "Назад" дважды или трижды, чтобы отклонить 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();
    }
});

Ответ 1

Вам нужно просто проверить , будет ли ваш 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(); 
        }
    }
});

Ответ 2

Объявлено глобально:

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, но я не понимаю, почему его нельзя использовать.

Ответ 3

Вы действительно должны использовать FragmentManager, чтобы отобразить диалоговое окно. Тогда будет легко узнать, знает ли memManager об определенном tagged dialogFragment:

Fragment foundFragment = getFragmentManager().findFragmentByTag("myItemEditDialogFragment");
if (foundFragment == null) {
    DialogFragment df = ItemEditDialogFragment.newInstance(o);
    df.setTargetFragment(this, 0);
    df.show(getFragmentManager().beginTransaction(), "myItemEditDialogFragment");
}

Вот как выглядит статический метод newInstance DialogFramgnet:

public static ItemEditDialogFragment newInstance(Item o) {
    ItemEditDialogFragment df = new ItemEditDialogFragment();

    Bundle args = new Bundle();
    args.putParcelable(ARG_INSTANCE, o);
    df.setArguments(args);

    return df;
}

Ответ 4

Поместите этот код, где вы хотите отобразить диалог, он проверяет наличие базы диалогов по имени своего тега.

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

MyDialog dialog = MyDialog.newInstance();
dialog.show(ft, "dialog");

Ответ 5

отключите кнопку, как только вы ее нажали, и снова включите ее, как только вы отмените диалог. как ниже

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

Если это не сработало, вам нужно взять одну логическую переменную и использовать ее для отображения и отмены диалога.

Ответ 6

Вероятно, вы должны управлять своими диалогами своей деятельностью, переопределяя метод onCreateDialog() и затем вызывая showDialog(). Это решит вашу проблему.

См. http://developer.android.com/reference/android/app/Activity.html#onCreateDialog (int, android.os.Bundle)

Обратный вызов для создания диалоговых окон, которые управляются (сохраняются и восстанавливаются) для вас по активности. Реализация по умолчанию вызывает toCreateDialog (int) для совместимости. Если вы нацеливаете HONEYCOMB или более позднюю версию, вместо этого вместо этого используйте вместо этого диалоговое окно.

Пример:

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

}

Ответ 7

попробуйте это.

Шаг 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, который вы можете изменить в соответствии с вашими требованиями.

Лучшее из удачи

Ответ 8

попробуйте вот так...

Dialog passwordDialog = new Dialog(SettingsActivity.this);


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