Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
В этом уроке:
- используем метод подготовки диалога
[url=http://www.startandroid.ru/ru/uroki/vse ... l:xy1b9jiz]Click here to read this article![/url:xy1b9jiz]
- используем метод подготовки диалога
[url=http://www.startandroid.ru/ru/uroki/vse ... l:xy1b9jiz]Click here to read this article![/url:xy1b9jiz]
Последний раз редактировалось damager82 12 май 2017, 11:54, всего редактировалось 12 раз.
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Поскольку onPrepareDialog() вызывается после onCreateDialog(), в onCreateDialog() можно не делать setMessage().
У меня надпись не изменялась, пока не убрал (Samsung GT-I9003, 2.3.5).
У меня надпись не изменялась, пока не убрал (Samsung GT-I9003, 2.3.5).
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Т.е. при каждом запуске висело время, которое прописалось в onCreateDialog?math64 писал(а):Поскольку onPrepareDialog() вызывается после onCreateDialog(), в onCreateDialog() можно не делать setMessage().
У меня надпись не изменялась, пока не убрал (Samsung GT-I9003, 2.3.5).
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
В своей программе, но так как в уроке. Текст - "Вы выиграли" или "Вы проиграли". Что было первым, то потом и показывается.
Если сделать точно по уроку - работает правильно, время изменяется.
Если сделать точно по уроку - работает правильно, время изменяется.
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Подскажите, как в onPrepareDialog() изменить items для AlertDialog'а ?
Ведь они указываются через builder, который затем возвращает AlertDialog посредством create()
Ведь они указываются через builder, который затем возвращает AlertDialog посредством create()
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Нашел вот такой способ, не по феншую, конечно, но работает железно.
все еще буду рад услышать правильный вариант через onPrepareDialog.
что-то близкое изложено здесь: http://stackoverflow.com/questions/4984 ... paredialog
Код: Выделить всё
private final int DIALOG_ID = 1;
private Activity activity;
...
activity.removeDialog(DIALOG_ID);
showDialog(DIALOG_ID);
что-то близкое изложено здесь: http://stackoverflow.com/questions/4984 ... paredialog
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
У AlertDialog'а можно достать ListView. У ListView - адаптер. Пиши свой адаптер (см. уроки по ListView и адаптерам) и скармливай адаптер билдеру вместо массива или списка items.andev писал(а):Подскажите, как в onPrepareDialog() изменить items для AlertDialog'а ?
Ведь они указываются через builder, который затем возвращает AlertDialog посредством create()
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
вроде понял, попробую. Спасибо
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Добрый день!
Я как запоздалый пассажир, запрыгнул некоторое время назад в проходящий поезд и на фоне остальных лишь сейчас дошел до 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 секунды. Это нормальное явление или я где-то наговнокодил?
Я как запоздалый пассажир, запрыгнул некоторое время назад в проходящий поезд и на фоне остальных лишь сейчас дошел до 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
onCreateDialog был объявлен как depricated в API level 13 (API level 13 вышла 15 July 2011)
-
- Сообщения: 4
- Зарегистрирован: 28 сен 2015, 11:53
Re: Урок 61. Диалоги. AlertDialog.Метод onPrepareDialog
Я бы отметил, что на сегодня этот вызов диалога showDialog @deprecated устарел и следует использовать DialogFragment вместо него.
При этом функция этого метода onCreateDialog вызывается каждый раз перед отображением окна диалога, так что onPrepareDialog() не актуальна.
Ну и актуальный код для работы с 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();
}