AlertDialog это ошибка?

1

Мое приложение создает AlertDialog, в котором пользователь вводит имя для сохранения. Когда пользователь нажимает кнопку сохранения, onClickListener проверяет дублируемое имя. Если имя уже существует, появится другое диалоговое окно, чтобы предупредить пользователя о замене существующих данных. Затем у пользователя есть выбор, чтобы отменить и вернуться, чтобы перейти на новое имя или продолжить и заменить данные.
Когда появится второе диалоговое окно, я ожидаю, что первое диалоговое окно будет отображаться до тех пор, пока я не вызову увольнение. Однако первый AlertDialog исчез до появления второго AlertDialog. Это отклонение автоматически вызывается при нажатии кнопки. Это ошибка или по дизайну?
Я написал тестовый пример, ниже которого я проверил 3 устройства: Nexus S android 4.0, HTC Rezound android 2.3 и Motorola Droid Bionic android 2.3.

раскладка

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

    <TextView 
        android:id="@+id/message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Some message will be here"
    />

    <Button
        android:id="@+id/show_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="Show"
    />

</LinearLayout>

Код

public class AlertDialogBug extends Activity 
{
    static final int DIALOG_ALERT_ID = 1;
    AlertDialog alertDlg;  
    TextView message;

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

        setContentView(R.layout.main);

        message = (TextView) findViewById(R.id.message);
        Button showButton = (Button) findViewById(R.id.show_btn);
        showButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                showDialog(DIALOG_ALERT_ID);
            }   
         });
     }

    private AlertDialog createAlertDialog()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Bug?");

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                // No dismiss, cancel, finish, or removeDialog,
                // but the dialog will disappear when this button is clicked.
            }

          });

         alertDlg = builder.create();
         alertDlg.setOnDismissListener(new OnDismissListener()
         {

             @Override
             public void onDismiss(DialogInterface dialog)
             {
                message.setText("onDismiss was called");
             }

          });

          return alertDlg;
    }

    @Override
    protected Dialog onCreateDialog(int id)
    {
        switch (id)
        {
            case DIALOG_ALERT_ID:
                return createAlertDialog();

            default:
                return super.onCreateDialog(id);
        }       
    } 

} 

Я изначально написал диалоговое окно сохранения как действие с android: theme = "@android: style/Theme.Dialog". Пользовательский интерфейс отлично смотрится на Nexus S и Rezound, но выглядит ужасно на Droid Bionic (поле редактирования и кнопка занимают половину ширины, другая половина пустая).

Теги:

2 ответа

3
Лучший ответ

Это по дизайну. Если вы не хотите отменить диалог, нажмите кнопку, ниже приведены некоторые коды для вас. Добавьте это в свой метод setPositiveButton, если вы не хотите отменять диалог.

try { 
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing"); 
field.setAccessible(true); 
field.set(dialog, false);

} catch (Exception e) { 
e.printStackTrace(); 
}

Затем, если вы хотите отменить диалог, просто добавьте это ниже.

try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}

Кстати, ваш xml никогда не вызывается вашим диалоговым окном. Поскольку метод setTitle() и setMessage предоставляется диалогом предупреждений.

Если вы хотите предоставить настраиваемый диалог, вызовите setCustomeView (макет).

Любые вопросы, дайте мне знать.

  • 1
    Спасибо, это работает, и это спасает меня от переписывания моего приложения. Схема выше предназначена для активности, а не для предупреждения. Мой голос был отклонен, потому что у меня недостаточно репутации, иначе вы получили бы 2 голоса.
1

Не ошибка - в этом случае onClick() предоставляется только так, что вы можете обновить действие UI/Take при нажатии кнопки.

Если вы хотите сохранить диалог, когда нажата кнопка "ОК", вы можете попробовать создать настраиваемую деятельность с прозрачным фоном с кнопкой "ОК/Отмена".

  • 0
    Я написал диалог сохранения как занятие. Я думаю, мне нужно вернуться к макету и посмотреть, что я сделал не так, что делает Droid Bionic странным. В любом случае, если это так, то вызов dismiss в onClick избыточен, не так ли?
  • 0
    Правильно, вам не нужно вызывать уволить слушателя. onDismiss может вызываться отдельно, если пользователь нажимает кнопку «назад» во время отображения диалога.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню