В моем приложении пользователь может добавлять новые города. Это должно происходить следующим образом:
- Нажимает кнопку «добавить город» в меню.
- Выбирает провинцию из появившегося списка (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(); } }