AlertDialog с пользовательским представлением в onCreate()

Вот мой код:

    public class MainActivity extends Activity {

    private static final int CONFIRMATION_DIALOG = 0;
    private View mLoginConfirmView;
    private TextView mTextViewLoginConfirm;
    private CheckBox mCheckBoxLoginConfirm;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mLoginConfirmView = View.inflate(this, R.layout.dialog_login_confirmation, null);
        mTextViewLoginConfirm = (TextView) mLoginConfirmView.findViewById(R.id.textView_DialogTranspConfirm);
        mCheckBoxLoginConfirm = (CheckBox) mLoginConfirmView.findViewById(R.id.checkBox_DialogTranspConfirm);

        showDialog(CONFIRMATION_DIALOG);
    }

    @Override
    @Deprecated
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case CONFIRMATION_DIALOG: {


            return new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.stat_sys_warning)
            .setTitle(R.string.app_name)
            .setView(mLoginConfirmView)
            .setPositiveButton(R.string.change, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    dialog.dismiss();

                    showDialog(EXIT_PROGRESS_DIALOG);
                }
            })
            .setNegativeButton(R.string.go_ahead, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    dialog.dismiss();

                    if (mCheckBoxLoginConfirm.isChecked())
                        setConfirmationDialogHidden();
                }
            })
            .create();
        }
            break;

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

    @Override
    @Deprecated
    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {
        case CONFIRMATION_DIALOG: 

            CheckBox checkBox = (CheckBox)dialog.findViewById(R.id.checkBox_DialogTranspConfirm);
            checkBox.setChecked(false);
            TextView textView = (TextView)dialog.findViewById(R.id.textView_DialogTranspConfirm);
            textView.setText(getString(R.string.you_use_service_for, Utils.getNumber()));


            break;

        default:
            break;
        }
        super.onPrepareDialog(id, dialog);
    }
}

Вылетает только на HTC One S, когда мое приложение возвращается из фона на строку, где я устанавливаю свой пользовательский вид:

.setView (млогинконфирмвиев)

Выброс: java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя. Сначала вы должны вызвать removeView() для родителя дочернего элемента. Я решил добавить следующую проверку: если у представления есть родитель, я ничего не делаю:

@Override
    @Deprecated
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case CONFIRMATION_DIALOG: {

        ViewGroup parent = (ViewGroup) mLoginConfirmView.getParent();
            if (parent!=null)
                return super.onCreateDialog(id);

            return new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.stat_sys_warning)
            .setTitle(R.string.app_name)
            .setView(mLoginConfirmView)
            .setPositiveButton(R.string.change, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    dialog.dismiss();

                    showDialog(EXIT_PROGRESS_DIALOG);
                }
            })
            .setNegativeButton(R.string.go_ahead, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    dialog.dismiss();

                    if (mCheckBoxLoginConfirm.isChecked())
                        setConfirmationDialogHidden();
                }
            })
            .create();
        }
            break;

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

Это правильный путь? Могу ли я показать диалоги из onCreate()?


person blyabtroi    schedule 20.09.2012    source источник


Ответы (1)


Произойдет сбой, поскольку пользовательский интерфейс действия еще не подготовлен, и действие еще не показано пользователю, Android показывает экран после завершения выполнения onResume(), попробуйте отобразить диалог из onResume()

person Hardik4560    schedule 20.09.2012