Android: Dialog dismisses without calling dismiss

2019-01-29 02:30发布

I have a dialog which performs some validation (below). Thee problem is, the dialog is dismissed after the Toast is displayed, without me calling dismiss. I need to show the toast and keep the dialog open to correct the error.

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

2条回答
男人必须洒脱
2楼-- · 2019-01-29 03:00

I think whatever you are trying to achieve is not possible with AlertDialog.bilder instead of that you can make

  1. object of Dialog.
  2. Set your layout for your dialog.
  3. Set the appropriate listener.

Example.

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

}

查看更多
\"骚年 ilove
3楼-- · 2019-01-29 03:09

My guess is that you are not creating and showing dialog as mentioned in the Android docs here http://developer.android.com/guide/topics/ui/dialogs.html using OnCreateDialog functions

Please do as mentioned in the docs and let us know if it still does not work.

查看更多
登录 后发表回答