Search code examples
androidandroid-alertdialogshowdialog

Transparent Background and No Buttons When Customizing Content of an AlertDialog on onPrepareDialog on Android


I am having some difficulties to update the content of an AlertDialog on the onPrepareDialog method.

I am setting the content of the AlertDialog, but the dialog comes to the screen with no buttons and no background. Probably the problem is related to the Builder.

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_USER_INFORMATION:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        return builder.create();
    default:
        return null;
    }
}

@Override
protected void onPrepareDialog(final int id, final Dialog dialog) {
    switch (id) {
    case DIALOG_USER_INFORMATION:
        createUserInformationAlertDialog(dialog);
        break;
    }
}

public void createUserInformationAlertDialog(Dialog dialogIn) {
    AlertDialog alertDialog = (AlertDialog) dialogIn;
    View dialoglayout = alertDialog.getLayoutInflater().inflate(
            R.layout.dialog_user_info,
            (ViewGroup) findViewById(R.id.dialog_user_layout_root));
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(dialoglayout);
    EventAttendant ea = this.event.getCrowd().getAttendees()
            .get(positionUserToHaveInformationDisplayedOnTheDialog);
    final EventAttendant clone = (EventAttendant) ea.clone();

        // Setting values
        TextView textView = (TextView) dialoglayout.findViewById(R.id.user_name_value);
        textView.setText(ea.getName());

        builder.setPositiveButton(Locale_PT_BR.SEE_ON_FACEBOOK,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {/* User clicked OK so do some stuff */
                    }
                });
        builder.setNegativeButton(Locale_PT_BR.BACK,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {...}
                });
        builder.setView(dialoglayout);
        alertDialog.setView(dialoglayout);
        alertDialog.setContentView(dialoglayout);
}

Solution

  • You should create the dialog in onCreateDialog() and change text in onPrepareDialog().

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_USER_INFORMATION:
            return createUserInformationAlertDialog();
    
        default:
            return null;
        }
    }
    
    @Override
    protected void onPrepareDialog(final int id, final Dialog dialog) {
        switch (id) {
        case DIALOG_USER_INFORMATION:
            prepareUserInformationAlertDialog((AlertDialog)dialog)
            break;
        }
    }
    
    public Dialog createUserInformationAlertDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton(Locale_PT_BR.SEE_ON_FACEBOOK,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {/* User clicked OK so do some stuff */
                    }
                });
        builder.setNegativeButton(Locale_PT_BR.BACK,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {...}
                });
        return builder.create();
    }
    
    public void prepareUserInformationAlertDialog(AlertDialog alertDialog) {
        EventAttendant ea = this.event.getCrowd().getAttendees()
                .get(positionUserToHaveInformationDisplayedOnTheDialog);
        final EventAttendant clone = (EventAttendant) ea.clone();
    
        View dialoglayout = alertDialog.getLayoutInflater().inflate(
                R.layout.dialog_user_info, null, false);
        // Setting values               
        TextView textView = (TextView) dialoglayout.findViewById(R.id.user_name_value);
        textView.setText(ea.getName());             
        alertDialog.setView(dialogLayout)
    }
    

    I haven't tested this code so it may contain some errors.