在onPrepareDialog中调用removeDialog(int)被认为是不好的形式,如下所示强制每次使用showDialog()调用时重新创建对话框:
@Override
public void onPrepareDialog(int id, Dialog dialog)
{
switch(id)
{
case REMOVE_WATCH_WORD :
removeDialog(REMOVE_WATCH_WORD);
break;
}
}
并在onCreateDialog中我用这个case参数处理它:
case REMOVE_WATCH_WORD :
CustomHelper ch = new CustomHelper();
final CharSequence[] watchWordsCharSequence = ch.getWatchWordsAsCharSequence(getApplicationContext());
return new AlertDialog.Builder(ActivityName.this)
.setTitle("Remove Word from List")
.setItems(watchWordsCharSequence, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), "\"" + watchWordsCharSequence[item] + "\" removed from List!", Toast.LENGTH_SHORT).show();
String removeString = (String) watchWordsCharSequence[item];
SharedPreferences.Editor editor = watchWords.edit();
editor.remove(removeString);
editor.commit();
}
}).create();
每次调用对话框时强制重新绘制对象是不是被认为是错误的形式?这样做的好处/缺点是什么?
答案 0 :(得分:4)
是的,我会考虑这种糟糕的形式。它甚至有用吗?即使在您第一次创建对话框后,也会调用onPrepareDialog()
,这意味着您在创建之后立即选择删除对话框。看起来对我有问题。
Activity
公开showDialog()
,dismissDialog()
,onCreateDialog()
,onPrepareDialog()
系列方法的全部原因是能够有效管理Dialog的生命周期,特别是,您不必手动保持对话框的引用。惯用生命周期是您在onCreateDialog()
中创建对话框,包括附加您需要的任何事件侦听器。然后在onPrepareDialog()
中初始化值,例如文本,初始值等等 - 或者换句话说“刷新”对话框以进行即将显示。应该没有理由在显示之间销毁和重新创建对话框。您应该实际查看正确刷新内容所需的内容,而不是使用removeDialog()
来“刷新”它。通常会涉及.getAdapter().notifyDataSetInvalidated()
之类的内容,或者如果使用CursorAdapter
,则调用requery()
以强制它重新运行查询并更新适配器内容。
如果您执行发现您仍然需要删除并重新创建对话框,那么我建议您放弃整个Activity
- 托管对话框,然后在需要时创建对话框它并调用其show()
方法。完成后,请关闭GC并将其排入队列。这绕过了Activity公开的整个show / create / prepare过程。
我建议坚持使用Activity管理的对话框,但如果你计划每次都删除对话框,那就不行了 - 在这种情况下只是实例化并.show()
答案 1 :(得分:0)
我认为删除Dialog的想法是一种有趣的方法,而不是为轻量级动态列表制作自定义适配器的开销。乍一看,从onPrepareDialog()中删除可能不是大多数实现的最佳方法。
另一种方法是仅在更新列表的动态数据时删除对话框。
private final int DIALOG_ID = 1;
String mDialogList[] = {"item 1","item 2"};
private void updateListData(){
mDialogList = new String[]{"new item 1","new item 2"};
removeDialog(DIALOG_ID);
}
使用此方法,对话框将仅在基础数据更改后重建,否则应由活动正常缓存和管理。