mako
mako

Reputation: 93

Nested AlertDialog

I'm facing a unreasolvable (for me) problem with nested AlertDialog using the following code

    final AlertDialog.Builder button_cook_action = new AlertDialog.Builder(this);
    final EditText cookMl = new EditText(this);
    cookMl.setInputType(InputType.TYPE_CLASS_NUMBER);
    button_cook.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            button_cook_action.setTitle(R.string.kitchen_recipe_button_cook)
                    .setMessage(R.string.kitchen_recipe_button_cook_volume)
                    .setView(cookMl)
                    .setPositiveButton(R.string.Yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            AlertDialog.Builder builderCooking = new AlertDialog.Builder(RecipeActivity.this);
                            builderCooking.setTitle(recipe.getName())
                            .setMessage("message");
                            builderCooking.show();
                        }
                    })
                    .setNegativeButton(R.string.No, null)
                    .show();
        }
    });

The first call works fine, but when i call it for a second time it gave me :

FATAL EXCEPTION: main
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

I already search in this forum but without any success.

If someone has a clue. Thanks in advance :)

Upvotes: 3

Views: 1723

Answers (2)

ligi
ligi

Reputation: 39549

You can do it like this - the problem was before if you use the EditText a second time it already has a parent - you need to create a new one each time inside your onClick() :

button_cook.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        final AlertDialog.Builder button_cook_action = new AlertDialog.Builder(this);
        final EditText cookMl = new EditText(this);
        cookMl.setInputType(InputType.TYPE_CLASS_NUMBER);

        button_cook_action.setTitle(R.string.kitchen_recipe_button_cook)
                .setMessage(R.string.kitchen_recipe_button_cook_volume)
                .setView(cookMl)
                .setPositiveButton(R.string.Yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        AlertDialog.Builder builderCooking = new AlertDialog.Builder(RecipeActivity.this);
                        builderCooking.setTitle(recipe.getName())
                        .setMessage("message");
                        builderCooking.show();
                    }
                })
                .setNegativeButton(R.string.No, null)
                .show();
    }
});

Upvotes: 3

Mukesh Rana
Mukesh Rana

Reputation: 4091

The problem is in the setView of your alertDialog. You have to inflate the layout everytime your create your dialog. In your case, your are inflating an EditText. So either you should create your EditText inside button_cook onClickListener or adopt the solution as posted by @ligi.

Upvotes: 1

Related Questions