Диалог открывается дважды при быстром нажатии кнопки
У меня есть 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();
}
}
});