Java 请帮助我在AlertDialog中设置上下文菜单

Java 请帮助我在AlertDialog中设置上下文菜单,java,android,sqlite,Java,Android,Sqlite,我已经为此工作了一整天,我真的很接近,但就是不能让它工作。我有一个按钮,可以打开一个AlertDialog,其中填充了保存的条目,包括名称和价格。现在,我可以单击对话框中的某个项目,让它自动填写“活动”中的“名称”和“价格”字段。我还希望能够长按一个项目,并收到一个选项删除它。这是我第一次尝试Android应用程序,其中很多都是根据记事本教程重新设计的。有两件事我搞不清楚: 1) 我的registerForContextMenu是否足够/正确 2) 我的onCreateContextMenu有什

我已经为此工作了一整天,我真的很接近,但就是不能让它工作。我有一个按钮,可以打开一个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看看是否有帮助。“我是否需要在某个地方声明该对话框”--否。