Java 请帮助我在AlertDialog中设置上下文菜单
我已经为此工作了一整天,我真的很接近,但就是不能让它工作。我有一个按钮,可以打开一个AlertDialog,其中填充了保存的条目,包括名称和价格。现在,我可以单击对话框中的某个项目,让它自动填写“活动”中的“名称”和“价格”字段。我还希望能够长按一个项目,并收到一个选项删除它。这是我第一次尝试Android应用程序,其中很多都是根据记事本教程重新设计的。有两件事我搞不清楚: 1) 我的registerForContextMenu是否足够/正确 2) 我的onCreateContextMenu有什么问题 谢谢Java 请帮助我在AlertDialog中设置上下文菜单,java,android,sqlite,Java,Android,Sqlite,我已经为此工作了一整天,我真的很接近,但就是不能让它工作。我有一个按钮,可以打开一个AlertDialog,其中填充了保存的条目,包括名称和价格。现在,我可以单击对话框中的某个项目,让它自动填写“活动”中的“名称”和“价格”字段。我还希望能够长按一个项目,并收到一个选项删除它。这是我第一次尝试Android应用程序,其中很多都是根据记事本教程重新设计的。有两件事我搞不清楚: 1) 我的registerForContextMenu是否足够/正确 2) 我的onCreateContextMenu有什
savedItems.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cDbHelper.open();
mNotesCursor = cDbHelper.fetchAllSaved();
startManagingCursor(mNotesCursor);
// Create an array of names and corresponding prices from db
String[] from = new String[]{SavedItemsDbAdapter.KEY_NAME, SavedItemsDbAdapter.KEY_PRICE};
// and an array of the fields we want to bind those fields to
int[] to = new int[]{R.id.text1, R.id.text2};
// Now create a simple cursor adapter and set it to display
SimpleCursorAdapter saved =
new SimpleCursorAdapter(NewEntry.this, R.layout.saved_row, mNotesCursor, from, to);
// Build an AlertDialog to hold this list
AlertDialog.Builder builder = new AlertDialog.Builder(NewEntry.this);
builder.setTitle("Choose from list");
// IS THIS SUFFICIENT TO REGISTER FOR CONTEXT MENU?
registerForContextMenu(v);
builder.setAdapter(saved, new DialogInterface.OnClickListener() {
// When an item from the list is clicked, it automatically populates the name and price fields in activity
@Override
public void onClick(DialogInterface dialog, int item) {
Cursor c = mNotesCursor;
c.moveToPosition(item);
Intent i = new Intent(NewEntry.this, NewEntry.class);
i.putExtra("name", c.getString(
c.getColumnIndexOrThrow(SavedItemsDbAdapter.KEY_NAME)));
i.putExtra("price", c.getString(
c.getColumnIndexOrThrow(SavedItemsDbAdapter.KEY_PRICE)));
startActivityForResult(i, ACTIVITY_AUTO);
finish();
}
// TRYING AND FAILING TO SET UP A CONTEXT MENU - the goal is to be able to long press,
// have a "Delete?" option pop up, which will delete the entry when clicked
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deleteItem(info.id);
return true;
}
return false;
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
}
我的registerForContextMenu是否足够/正确
您正在为任何savedItems
注册上下文菜单。如果这是您想要的上下文菜单,那么您就可以了
如果您的目标是在对话框列表中的项目上有一个上下文菜单,那么您的方法是错误的。您将无法使用AlertDialog.Builder
。您需要创建一个自定义的AlertDialog
子类,这样您就可以在那里重写onCreateContextMenu()
。我刚刚找到
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
被称为,但不是
@Override
public boolean onContextItemSelected(MenuItem item) {
在我的子类AlertDialog中:
public class MyAlertDialog extends AlertDialog implements
OnCreateContextMenuListener {
也许这对其他人很有用,因为我很确定您同时解决了手头的问题。您只需要实现以下功能。它会起作用的
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
Log.e(LOGTAG, "Tao menu");
if(v == expList)
{
super.onCreateContextMenu(menu, v, menuInfo);
//AdapterContextMenuInfo aInfo = (AdapterContextMenuInfo) menuInfo;
// We know that each row in the adapter is a Map
//HashMap map = (HashMap) simpleAdpt.getItem(aInfo.position);
menu.setHeaderTitle("Options");
menu.add(1, 1, 1, "Reprint");
menu.add(1, 2, 1, "Void");
menu.getItem(0).setOnMenuItemClickListener(new OnMenuItemClickListener()
{
public boolean onMenuItemClick(MenuItem clickedItem)
{
return true;
}
});
menu.getItem(1).setOnMenuItemClickListener(new OnMenuItemClickListener()
{
public boolean onMenuItemClick(MenuItem clickedItem)
{
return true;
}
});
}
}
谢谢你的回复。您是否可以为我指出创建AlertDialog自定义子类的正确方向?谢谢。我打算在这里过夜:@evanl81:不,那个样品也不太适合你的需要。您需要创建
AlertDialog
(或Dialog
,以两者为准)的自定义子类,例如您可能会发现使用主题为活动的对话框更简单(android:theme=“@android:style/theme.Dialog”
)在活动的清单条目中。我最初使用的是theme.Dialog,但我觉得它看起来有点难看。我将查看您的链接,谢谢。@evanl81:“但是当我试图运行应用程序时,我收到一条消息,它有错误(它没有错误)”——我假设您正在使用Eclipse。检查控制台日志。考虑使用ProjksCube看看是否有帮助。“我是否需要在某个地方声明该对话框”--否。