Android: диалоговое окно закрывается без вызова отклонения

У меня есть диалог, который выполняет некоторую проверку (ниже). Проблема в том, что диалоговое окно закрывается после отображения Toast, и я не вызываю его. Мне нужно показать тост и оставить диалог открытым, чтобы исправить ошибку.

final EditText txtName = new EditText(this);
AlertDialog.Builder dlgAdd = new AlertDialog.Builder(this)
    .setTitle(R.string.create_category)
    .setMessage(R.string.name)
    .setView(txtName)
    .setPositiveButton(R.string.ok, new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String newCatName = txtName.getText().toString().trim(); // Converts the value of getText to a string.
            if (newCatName != null && newCatName .length() ==0)
            {  
                Toast.makeText(ManageCategories.this, R.string.err_name_required, 3500).show();

            } else {
                try {
                    boolean alreadyExists = mDatabaseAdapter.getCategoryIDs(newCatName).length > 0;// ids of cats with this name
                    if(alreadyExists) {
                        Toast.makeText(ManageCategories.this, R.string.categoryAlreadyExists, 3500).show();
                    } else {
                        mDatabaseAdapter.addCategory(newCatName);
                    }
                }catch(Exception ex){
                    Toast.makeText(ManageCategories.this, R.string.error+':'+ ex.getLocalizedMessage(), 3500).show();
            }
            }
        }
    }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
});
dlgAdd.show();

person Echilon    schedule 02.01.2011    source источник
comment
вы помните, как это было решено? Принятый ответ не помогает: именно на этой странице вы можете прочитать Когда пользователь касается любой из кнопок действий, созданных с помощью AlertDialog.Builder, система закрывает диалоговое окно для вас. согласно этому, должно быть невозможно сохранить диалоговое окно onPositiveClick .   -  person natario    schedule 05.08.2015


Ответы (2)


Я предполагаю, что вы не создаете и не показываете диалог, как указано в документации Android здесь http://developer.android.com/guide/topics/ui/dialogs.html с использованием функций OnCreateDialog.

Пожалуйста, сделайте, как указано в документации, и сообщите нам, если это все еще не работает.

person the100rabh    schedule 02.01.2011
comment
Правильный. Сработало, но мне нужно было создать многоразовый диалоговый класс. - person Echilon; 03.01.2011
comment
AlertDialog.Builder create() developer.android.com/ reference/android/app/ вместо show() можно использовать с тем же эффектом в коде, который вы указали выше, без создания повторно используемого диалогового класса. - person the100rabh; 05.01.2011
comment
У меня это не работает: как в этом фрагменте, Я расширяю DialogFragment и возвращаю диалог onCreateDialog(); но тем не менее, я не могу выполнить проверку ошибок, когда пользователь нажимает любую из кнопок: диалог автоматически закрывается, и я не могу его оставить. - person natario; 05.08.2015

Я думаю, что все, чего вы пытаетесь достичь, невозможно с помощью AlertDialog.bilder, вместо этого вы можете сделать

  1. Объект диалога.
  2. Установите макет для вашего диалога.
  3. Установите соответствующий слушатель.

Пример.

dialog_view.xml

<?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">

<EditText 
            android:layout_height="wrap_content" 
            android:id="@+id/EditText01" android:layout_width="300dip" android:ellipsize="none"/>

<LinearLayout 
        android:id="@+id/LinearLayout01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">

        <Button 
                android:id="@+id/Button01" 
                android:layout_height="wrap_content" 
                android:text="Yes" 
                android:layout_width="100dip"/>

        <Button 
                android:id="@+id/Button02" 
                android:layout_height="wrap_content" 
                android:text="No" 
                android:layout_width="100dip"/>
</LinearLayout>

  </LinearLayout>

Help.java

public class Help extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    d =  new Dialog(Help.this,
            android.R.style.Theme_InputMethod);

    createMyDialog();
}
  private Dialog d;
private void createMyDialog() {
    d.setContentView(R.layout.dialog_view);
    Button b1 = (Button)findViewById(R.id.Button01);
    Button b2 = (Button)findViewById(R.id.Button02);
    EditText t = (EditText) findViewById(R.id.EditText01);
    OnTouchListener listner1 = null;
    OnTouchListener listner2 = null;
    b1.setOnTouchListener(listner1);
    b2.setOnTouchListener(listner2);
    listner1 = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return false;
        }
    };
    listner2 = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return false;
        }
    };
            d.show();
}

}

person Vivek    schedule 03.01.2011