Пользовательский AlertDialog не может инициализироваться в onCreate () - PullRequest
1 голос
/ 31 декабря 2011

Я пытаюсь создать пользовательский AlertDialog, расширяя класс AlertDialog.
Как обычно, я настраиваю диалог внутри его метода onCreate().Или я пытаюсь сделать это:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.setTitle("Some title");
    this.setButton(BUTTON_POSITIVE, "Click me", (DialogInterface.OnClickListener)null);

    final FrameLayout custom = (FrameLayout) this
            .findViewById(android.R.id.custom);

    custom.addView(this.getLayoutInflater().inflate(R.layout.mydlg, null),
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

}

Теперь, когда дело доходит до отображения экземпляра этого диалогового окна, ничего не отображается . Текущий Activity исчезает и теряет фокус, но ни один пиксель моего диалога не отображается.Нажатие Back возвращает Activity обратно на передний план , указывая мне, что на самом деле отображается , но только полностью пустой.

Однако, когда я создаю AlertDialog и использую, например, dlg.setButton(BUTTON_POSITIVE, "Click me", (DialogInterface.OnClickListener)null);, диалоговое окно отображается с соответствующей кнопкой.
Даже когда я настраиваю свой настраиваемый диалог в его конструкторе, используя тот же код, что и выше, все кажетсяработать нормально.

Теперь, как это может быть?Почему я не могу инициализировать мой диалог в методе onCreate()?Разве вы не должны инициализировать любой элемент GUI?Чего мне не хватает?

РЕДАКТИРОВАТЬ

Обратите внимание, что что-то"показано", затухая в действии и снимая с нее фокус.Просто он кажется совершенно пустым / невидимым.

Вот еще одна попытка:

    this.setTitle("Some title");
    this.setButton(BUTTON_POSITIVE, "Click me", (DialogInterface.OnClickListener)null);

    final View v = this.getLayoutInflater().inflate(R.layout.mydlg, null);

    this.setView(v);

Эти точные строки делают работают, когда помещаются в конструктор моего диалога.
Эти точные строки не работают, когда помещены в мой диалог onCreate().

Что здесь происходит?!

Как правило, я не должен делатьэто в onCreate()?- Могу ли я столкнуться с проблемой, если вместо этого прибегну к вышеуказанной инициализации в конструкторе?(Во всяком случае, это не кажется мне слишком чистым.)

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

Вам нужно вызвать метод show(), чтобы что-то увидеть.

1 голос
/ 23 октября 2013

Извините, что опоздал на вечеринку:)

В диалоговом окне с предупреждением вы должны действовать иначе.

Я сделал так, чтобы настроить вид перед созданием диалогового окна предупреждения:

// This is the activity that is the background of the AlertDialog
public class Main extends Activity {

    public static final int DIALOG_CONFIG = 1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.emptybackground);
    }

    @Override
    protected void onStart() {
        super.onStart();

        // Open the alert dialog on openning the Activity
        showDialog(Main.DIALOG_CONFIG );
    }

    protected Dialog onCreateDialog(int id) {
        LayoutInflater factory = LayoutInflater.from(this);
        switch (id) {
        case DIALOG_CONFIG:
            // Here, we load the existing view R.layout.config
            configView = factory.inflate(R.layout.config, null);
            configDialog = new AlertDialog.Builder(this)
                .setTitle("Configuration")
                .setView(configView)
                .create();

            // Using configView, you can do whatever you want with the view. Here, we add value to a spinner.
            Spinner spinner = (Spinner)configView.findViewById(R.id.config_select_conn);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter.add("TCP");
            adapter.add("Bluetooth");
            spinner.setAdapter(adapter);

            return configPrinter;
        }
        return null;
    }
}
1 голос
/ 31 декабря 2011

Вы должны рассмотреть возможность использования AlertDialog.Builder вместо того, чтобы создавать подклассы самого AlertDialog.Это позволяет вам делать все, что вам нужно в вашем примере (по порядку: setTitle (), setPositiveButton () и setView ()).Не забудьте вызвать create () в конце, чтобы получить диалог.

Кроме того, проверьте, правильно ли реализованы ваши методы действий onCreateDialog () и onPrepareDialog ().Если они вообще не реализованы (неуправляемое диалоговое окно), в любом случае рассмотрите возможность сделать это, особенно если ваше приложение допускает изменения ориентации.Вы, вероятно, знаете об этом, но вот учебник:

http://developer.android.com/guide/topics/ui/dialogs.html

также, DialogFragments - немного более простой способ реализовать это, но вам нужна более новая версия API или пакет совместимости:

http://developer.android.com/reference/android/app/DialogFragment.

Последний вопрос - куда вы звоните show () в своей деятельности?onResume () должно быть в порядке, onCreate () не так много.

...