В моём приложении пользователь может добавлять новые города.Это должно выглядеть следующим образом:
- Нажмите кнопку «Добавить город» из меню.
- Выбирает провинцию из списка (AlertDialog), который появляется.
- Выбирает город из списка, который создается на основе выбранной провинции.
Диалог провинции всегда будет таким же, поэтому я сделал диалог города отдельным диалогом.Проблема в том, что поскольку onCreateDialog () вызывается только при первом добавлении города, я не могу понять, как настроить этот список на основе выбранной провинции.addItems () - это метод AlertDialog.builder, который, насколько я могу судить, не очень полезен для меня в onPrepareDialog.
Как каждый раз изменять список элементов в диалоговом окнеПозвонил (и обновил onClickListener соответственно?
Редактировать: я добавил код, который у меня есть. У меня есть две основные проблемы с текущей реализацией:
- Диалог города(SelectLocationDialog) выглядит совершенно иначе, чем диалог провинции. Я не могу понять, как сделать так, чтобы они выглядели одинаково (сейчас я использую android.R.layout.simple_list_item_1 для диалога городов).
Для диалога городов нет onClickListener, поэтому он ничего не делает.
@Override
protected Dialog onCreateDialog(int id, Bundle args) {
AlertDialog.Builder builder = null;
switch (id) {
case DIALOG_SELECT_PROVINCE:
return SelectProvinceDialog.create(this);
case DIALOG_SELECT_LOCATION:
return SelectLocationDialog.create(this);
default:
return null;
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case DIALOG_SELECT_LOCATION:
// looks up all cities/sites in the province selected in the
// previous dialog
siteList = new XmlSiteListReader(this);
siteList.findSitesByProvince(Province.valueOf(
Province.getAbbreviatedName(selectedProvince)));
String[] sites = siteList.siteNames();
ListView siteListView = new ListView(this);
ArrayAdapter<CharSequence> siteListAdapter =
new ArrayAdapter<CharSequence>(this,
android.R.layout.simple_list_item_1, sites);
siteListView.setAdapter(siteListAdapter);
dialog.setContentView(siteListView);
}
}
/**
* A dialog that allows the user to select a province/region from which to add
* locations to watch.
*
* @author Dean Morin
*/
public class SelectProvinceDialog {
private static final String[] PROVINCES;
static {
PROVINCES = new String[Province.values().length];
Province[] provinces = Province.values();
for (int i = 0; i < provinces.length; i++) {
PROVINCES[i] = provinces[i].getFullName();
}
}
/**
* Creates the 'Select Province' dialog window.
*
* @param context The context for this dialog.
* @return The constructed dialog.
*/
public static AlertDialog create(final Context context) {
AlertDialog.Builder selectProv = new AlertDialog.Builder(context);
selectProv.setTitle("Select Province");
selectProv.setItems(PROVINCES, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
((WeatherWatch) context).setSelectedProvince(PROVINCES[item]);
((Activity) context)
.showDialog(WeatherWatch.DIALOG_SELECT_LOCATION, null);
}
});
return selectProv.create();
}
}
public class SelectLocationDialog {
/**
* Creates the 'Select Location' dialog window.
*
* @param context The context for this dialog.
* @return The constructed dialog.
*/
public static AlertDialog create(final Context context) {
AlertDialog.Builder selectLoc = new AlertDialog.Builder(context);
return selectLoc.create();
}
}