Страница 1 из 1

Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 01 мар 2012, 03:00
damager82
В этом уроке:

- используем метод подготовки диалога

[url=http://www.startandroid.ru/ru/uroki/vse ... l:xy1b9jiz]Click here to read this article![/url:xy1b9jiz]

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 30 июл 2012, 07:42
math64
Поскольку onPrepareDialog() вызывается после onCreateDialog(), в onCreateDialog() можно не делать setMessage().
У меня надпись не изменялась, пока не убрал (Samsung GT-I9003, 2.3.5).

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 30 июл 2012, 11:07
damager82
math64 писал(а):Поскольку onPrepareDialog() вызывается после onCreateDialog(), в onCreateDialog() можно не делать setMessage().
У меня надпись не изменялась, пока не убрал (Samsung GT-I9003, 2.3.5).
Т.е. при каждом запуске висело время, которое прописалось в onCreateDialog?

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 30 июл 2012, 12:17
math64
В своей программе, но так как в уроке. Текст - "Вы выиграли" или "Вы проиграли". Что было первым, то потом и показывается.
Если сделать точно по уроку - работает правильно, время изменяется.

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 08 авг 2012, 15:54
andev
Подскажите, как в onPrepareDialog() изменить items для AlertDialog'а ?
Ведь они указываются через builder, который затем возвращает AlertDialog посредством create()

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 08 авг 2012, 16:25
andev
Нашел вот такой способ, не по феншую, конечно, но работает железно.

Код: Выделить всё

private final int DIALOG_ID = 1;
private Activity activity;
...
activity.removeDialog(DIALOG_ID);
showDialog(DIALOG_ID);
все еще буду рад услышать правильный вариант через onPrepareDialog.
что-то близкое изложено здесь: http://stackoverflow.com/questions/4984 ... paredialog

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 08 авг 2012, 17:29
math64
andev писал(а):Подскажите, как в onPrepareDialog() изменить items для AlertDialog'а ?
Ведь они указываются через builder, который затем возвращает AlertDialog посредством create()
У AlertDialog'а можно достать ListView. У ListView - адаптер. Пиши свой адаптер (см. уроки по ListView и адаптерам) и скармливай адаптер билдеру вместо массива или списка items.

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 08 авг 2012, 17:30
andev
вроде понял, попробую. Спасибо

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 18 июн 2013, 23:28
EvilAngel
Добрый день!
Я как запоздалый пассажир, запрыгнул некоторое время назад в проходящий поезд и на фоне остальных лишь сейчас дошел до 61-го урока. Его мне захотелось "интерактивно" видоизменить. И вот, что получилось:
[syntax=java]
package ru.startandroid.develop.p0611alertdialogprepare;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
final static String LOG_TAG = "myLogs";
final int DIALOG = 1;
AlertDialog dialog;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void onclick(View v) {
showDialog(DIALOG);
}

protected Dialog onCreateDialog(int id) {
Log.d(LOG_TAG, "onCreateDialog");
if (id == DIALOG) {
AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.setTitle("Текущее время");
adb.setMessage("");
dialog = adb.create();
final Handler uiHandler = new Handler();
Timer tm = new Timer();
tm.schedule(new TimerTask() {
@Override
public void run() {
uiHandler.post(new Runnable() {
@Override
public void run() {
dialog.setMessage(sdf.format(new Date(System
.currentTimeMillis())));
}
});
}
}, 0L, 1000);
//adb.setMessage(sdf.format(new Date(System.currentTimeMillis())));

return dialog;
}
return super.onCreateDialog(id);
}

protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
Log.d(LOG_TAG, "onPrepareDialog");
/*if (id == DIALOG) {
((AlertDialog) dialog).setMessage(sdf.format(new Date(System
.currentTimeMillis())));
}*/
}
}
[/syntax]

И теперь, возможно и не в тему, но вопрос: У меня почему то время запущенное таймером на эмуляторе отстаёт от системного времени моего компа на 1.3 секунды. Это нормальное явление или я где-то наговнокодил?

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 20 ноя 2013, 16:59
altwin
onCreateDialog был объявлен как depricated в API level 13 (API level 13 вышла 15 July 2011)

Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog

Добавлено: 28 сен 2015, 12:01
MiG_Kharkov
Я бы отметил, что на сегодня этот вызов диалога showDialog @deprecated устарел и следует использовать DialogFragment вместо него.
При этом функция этого метода onCreateDialog вызывается каждый раз перед отображением окна диалога, так что onPrepareDialog() не актуальна.

Ну и актуальный код для работы с DialogFragment:

Код: Выделить всё

package ua.com.webtuning.startandroid;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment; //Важно этот класс!!!
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

public class MyAlertDialogFragment extends DialogFragment {

    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");

        Log.d("myLogs","Create Dialog Fragment");
        return new AlertDialog.Builder(getActivity())
                .setIcon(R.mipmap.ic_launcher)
                .setTitle(title)
                .setPositiveButton(R.string.alert_dialog_ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity) getActivity()).doPositiveClick();
                            }
                        }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity) getActivity()).doNegativeClick();
                            }
                        }
                )
                .setNeutralButton(R.string.alert_neutral_buttom, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ((MainActivity) getActivity()).doNeutralClick();

                    }
                })
                .create();
    }

}

Код: Выделить всё

<resources>
    <string name="alert_dialog_ok">Ok</string>
    <string name="alert_dialog_cancel">Cancel</string>
    <string name="alert_two_buttons_title">Dialog Tow Buttons</string>
    <string name="alert_neutral_buttom">Neutral</string>
</resources>
И в главную добавить:

Код: Выделить всё

    public void onclick(View view) {
        if (view.getId() == R.id.tvFragment) {
            DialogFragment newFragment =
                    MyAlertDialogFragment.newInstance(R.string.alert_two_buttons_title);
            newFragment.show(getFragmentManager(), "myDialogFragment");
        }
    }
    public void doPositiveClick() {
        Toast.makeText(MainActivity.this, "Вы выбрали кнопку OK!",
                Toast.LENGTH_LONG).show();
    }

    public void doNegativeClick() {
        Toast.makeText(MainActivity.this, "Вы выбрали кнопку отмены!",
                Toast.LENGTH_LONG).show();
    }

    public void doNeutralClick() {
        Toast.makeText(MainActivity.this, "Вы выбрали кнопку нейтрально!",
                Toast.LENGTH_LONG).show();
    }