AlertDialog не создается, хотя я вызываю onCreateDialog на Android - PullRequest
3 голосов
/ 01 сентября 2011

Я столкнулся со следующей проблемой.

У меня есть изображение Gallery, и я хочу открыть AlertDialog, чтобы отобразить некоторую информацию относительно изображения, на которое нажали. Первый раз, когда я нажимаю на изображение, оно работает просто отлично. Но в следующий раз, даже когда я нажимаю на другое изображение, снова появляется тот же диалог.

UserCase

Когда я следую этому примеру пользователя

  1. Выберите изображение в позиции 2
  2. Закрыть диалог
  3. Выберите изображение в позиции 6
  4. Закрыть диалог

, я получаю эти отпечатки:

click na galeria... position: 2
startUserInformationDialog()... `this.position`: 2
onCreateDialog on switch.. `this.position`: 2
DISMISSING DIALOG `this.position`: 2

click na galeria... position: 6
startUserInformationDialog()... `this.position`: 6
DISMISSING DIALOG `this.position`: 6

Это означает, что код не выполняется через onCreateDialog

код

public AlertDialog createUserInformationAlertDialog() {
        LayoutInflater inflater = getLayoutInflater();
        View dialoglayout = inflater.inflate(R.layout.dialog_user_info,
                (ViewGroup) findViewById(R.id.dialog_user_layout_root));
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(dialoglayout);
        final MyObject ea = myList.get(positionUserToHaveInformationDisplayedOnTheDialog);
            // Setting values according to element to be shown
            TextView textView = (TextView) dialoglayout
                    .findViewById(R.id.user_name_value);
            textView.setText(ea.getName());
            ...
            builder.setNegativeButton(Locale_PT_BR.BACK,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                            Log.d("PRINT 1",
                                    "DISMISSING DIALOG `this.position`: "
                                            + positionUserToHaveInformationDisplayedOnTheDialog);
                            dialog.dismiss();
                        }
                    });
            return builder.create();
}


private void startUserInformationDialog() {
    Log.d("PRINT 2", "startUserInformationDialog()... `this.position`: "
            + positionUserToHaveInformationDisplayedOnTheDialog);
    showDialog(DIALOG_USER_INFORMATION);
}



@Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_USER_INFORMATION:
            Log.d("PRINT 3", "onCreateDialog on switch.. `this.position`: "
                    + positionUserToHaveInformationDisplayedOnTheDialog);
            return createUserInformationAlertDialog();
        default:
            return null;
        }
    }

private void startGallery() {
        myPhotoBar = (Gallery) findViewById(R.id.gallery);
        myPhotoBar.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView parent, View v, int position,
                    long id) {
                Log.d("PRINT 4", "click na galeria... position: " + position);
                positionUserToHaveInformationDisplayedOnTheDialog = position;
                startUserInformationDialog();
            }
        });

}

Ответы [ 4 ]

4 голосов
/ 01 сентября 2011

Используйте метод onPrepareDialog(), чтобы заполнить диалог данными. Если вы хотите, чтобы диалог был уничтожен, вы должны вызвать метод removeDialog().

1 голос
/ 01 сентября 2011

И это нормально, потому что если вы видите doc , onCreateDialog вызывается в первый раз.

"Когда в первый раз запрашивается диалоговое окно , Android вызывает onCreateDialog (int) из вашей деятельности, в которой вы должны создать экземпляр диалога. Этот метод обратного вызова передается тот же идентификатор, который вы передали в showDialog (int). После создания диалога верните объект в конце метода. "

Вы должны знать, что это будет создано один раз.

Звоните onPrepareDialog .

"Перед отображением диалогового окна Android также вызывает необязательный метод обратного вызова onPrepareDialog (int, Dialog). Определите этот метод, если вы хотите изменять какие-либо свойства диалогового окна при каждом его открытии . Этот метод вызывается каждый раз, когда открывается диалоговое окно , , тогда как onCreateDialog (int) вызывается только при первом открытии диалогового окна . Если вы не определили onPrepareDialog (), тогда диалоговое окно останется таким же, каким оно было в прошлый раз, когда оно было открыто. Этому методу также передается идентификатор диалогового окна вместе с объектом Dialog, созданным в onCreateDialog (). "

1 голос
/ 01 сентября 2011

Я считаю, что showDialog вызывает onCreateDialog только один раз, если идентификатор тот же.Если вы хотите обновить уже созданный диалог, вы можете переопределить onPrepareDialog, чтобы обновить все, что вам нравится, перед тем, как он будет показан пользователю.

0 голосов
/ 13 апреля 2016

Вы можете попробовать эту простую библиотеку всплывающих окон для Android .Это очень просто для использования в вашей деятельности.

достаточно одной строки кода для создания диалога, если вам не нужны сложные функциональные возможности.

Pop.on(activity).with().title(R.string.title).body(R.string.body).show();

Просто включите следующую библиотеку в ваш gradleзависимости

dependencies {
    compile 'com.vistrav:pop:2.0'
}
...