开发者

ContextMenu in Dialog

I have my standard code for ContextMenu (long press on ListView item) but I created this class (helper Dialog) and it doesn't register

onContextItemSelected

method, I have no idea why. Where is the problem? =/ In my layout XML I have regular ListView with @+id/list (I'm not extending ListActivity).

public class CheckListDialog extends Dialog implements OnClickListener {
public CheckListDialog(Context context) {
    super(context);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    mainContext = context;

    setContentView(R.layout.dialog_check_list);

    list = (ListView) findViewById(R.id.list);
    registerForContextMenu(list);

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?>开发者_开发百科; parent, View view, int position, long id) {
            doSomething(); // This IS working.
        }           
    });
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
  if (v == list) {

    // This IS working.

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
    menu.setHeaderTitle("Something");
    String[] menuItems = mainContext.getResources().getStringArray(R.array.menu);
    for (int i = 0; i<menuItems.length; i++) {
      menu.add(Menu.NONE, i, i, menuItems[i]);
    }
  }
}

// This IS NOT working! (Method isn't called at all)
@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
  int menuItemIndex = item.getItemId();

  String[] menuItems = mainContext.getResources().getStringArray(R.array.menu);
  String menuItemName = menuItems[menuItemIndex];

  if (menuItemName.equals("Delete")) {
      doSomething();
  }

  return true;
}

@Override
public void onContextMenuClosed(Menu menu) {
    doSomething();
}

private ListView list;

}


You only need implement the following function. It will work.

@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;
            }
        });
    }
}


After this line: registerForContextMenu(list);

type this: list.setOnCreateContextMenuListener(this);

And instead of onContextItemSelected(MenuItem item) function use this:

@Override
public boolean onMenuItemSelected(int featureId, MenuItem menuItem) {


Other possible variant to call the fake context menu (other alert dialog with a list of selectable items)

@Override
protected Dialog onCreateDialog(int id) {
 switch (id) {
   case CONTEXTMENU_DIALOG: {  
     AlertDialog a = new AlertDialog.Builder(myActivity.this)
    .setItems(R.array.contextmenuitems,
             new DialogInterface.OnClickListner() {
              public void onClick(DialogInterface dialog, int whichbutton) {
                 switch (whichbutton) {
                   case 0:{
                     doSomething();
                     dialog.dismiss();
                     return;
                   }
                 }
              }
      }).create;
      a.show();
      return a;
    }

   case MY_DIALOG:{
      //create your dialog here
   }
 }
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
  switch (id) {
    case MY_DIALOG:{
         list = (ListView) findViewById(R.id.list);
         list.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
              showDialog(CONTEXTMENU_DIALOG);
              return true;
            }           
         });
    }
  }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜