gpt4 book ai didi

android - 寻找有关如何重用 AlertDialogs 以确认上下文菜单对 ActivityList 项目的操作的建议

转载 作者:太空狗 更新时间:2023-10-29 15:23:42 24 4
gpt4 key购买 nike

我使用 ListActivity 来显示项目列表。用户可以长按列表中的项目以显示上下文菜单。此菜单除其他内容外还包含删除长按项目的选项。当用户选择此选项时,会弹出一个对话框,要求确认删除。确认后,该项目将从列表中删除。

我想尽可能多地重用 AlertDialog。我尝试使用 onPrepareDialog(int, View, Bundle) 失败了,因为 Bundle 没有传递给 DialogInterface.OnClickListener .我最终不得不在每次调用时重新创建一个监听器。

我看到了几种解决这个问题的方法:

  1. 每次都重新创建对话(优点:简单,缺点:浪费)
  2. DialogInterface.OnClickListener 保留在 ListActivity 的一个字段中,并将要删除的项目保留为监听器的一个字段。 (优点:没有内存浪费,缺点:需要管理状态)。问:这样安全吗?
  3. onPrepareDialog 更新标题,并在 AlertDialog 的按钮上绑定(bind)新的 View.OnClickListener。 (优点:减少浪费,缺点:每次调用时都使用新的 View.OnClickListener)。

如果 DialogInterface.OnClickListener 接受了一个 Bundle,我就不必为了跟踪被删除的项目而费尽心思。

这不是一个障碍,但我很乐意看到一个优雅的解决方案。我很想听听您的建议:)

这里是选项 #1 的代码,如果你想玩这个:

public class Example extends ListActivity {
private static final int CONFIRM_DELETE_DIALOG = 1;
private static final String POSITION_KEY = "position";

private ArrayAdapter<String> mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_1,
new String[] { "one", "two" });
setListAdapter(mAdapter);
registerForContextMenu(getListView());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.my_lovely_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.delete_item:
Bundle bundle = new Bundle();
bundle.putInt(POSITION_KEY, info.position);
showDialog(CONFIRM_DELETE_DIALOG, bundle);
return true;
default:
return super.onContextItemSelected(item);
}
}

@Override
protected Dialog onCreateDialog(int id, Bundle args) {
switch (id) {
case CONFIRM_DELETE_DIALOG:
final int position = args.getInt(POSITION_KEY);
AlertDialog.Builder builder = new AlertDialog.Builder();
builder.setCancelable(false);
builder.setTitle(String.format(
getString(R.string.confirm_delete), mAdapter.getItem(position)));
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
mAdapter.remove(mAdapter.getItem(position));
// Dismiss the dialog to ensure OnDismissListeners are notified.
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEGATIVE:
// Cancel the dialog to ensure OnCancelListeners are notified.
dialog.cancel();
break;
}
// Remove the dialog so it is re-created next time it is required.
removeDialog(CONFIRM_DELETE_DIALOG);
}
};
builder.setPositiveButton(android.R.string.yes, listener);
builder.setNegativeButton(android.R.string.no, listener);
return builder.create();
default:
return super.onCreateDialog(id, args);
}
}
}

最佳答案

我认为选项 1 或非常接近它的选项可能是可用的最优雅的解决方案。

选项 1 和示例代码应该有效,但该模式很容易被无意中使用,对话框更改为 setCancelable(true)。如果发生这种情况,则可以使用返回按钮关闭对话框,从而跳过 removeDialog(CONFIRM_DELETE_DIALOG)。这将导致对话框在下次打开时可能带有错误的位置值。

出于这个原因,我认为应该调整选项 1 方法以从 onCreateDialogDialogInterface.onClickListener 中重新定位 removeDialog(CONFIRM_DELETE_DIALOG) > 到 DialogInterface.OnDismissListener,在 onPrepareDialog 中设置:

protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
switch (id) {
case CONFIRM_DELETE_DIALOG:
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
removeDialog(CONFIRM_DELETE_DIALOG);
}
});
break;
default:
super.onPrepareDialog(id, dialog, args);
}
}

另一种避免使用 onPrepareDialog 的方法是在 onCreateDialog 中绑定(bind) DialogInterface.OnDismissListener:

    Dialog dialog = builder.create();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
removeDialog(CONFIRM_DELETE_DIALOG);
}
});
return dialog;

关于android - 寻找有关如何重用 AlertDialogs 以确认上下文菜单对 ActivityList 项目的操作的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4551135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com