ContextMenu в диалоге

1

У меня есть свой стандартный код для ContextMenu (долгое нажатие на элементе ListView), но я создал этот класс (helper Dialog) и не регистрирует

onContextItemSelected

я понятия не имею, почему. В чем проблема? знак равно В моем компоновке XML у меня есть обычный ListView с @+ id/list (я не расширяю 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;

}

Теги:
contextmenu
dialog

3 ответа

2

Вам нужна только следующая функция. Он будет работать.

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

Другой возможный вариант для вызова поддельного контекстного меню (другое диалоговое окно предупреждения со списком выбираемых элементов)

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

После этой строки:  registerForContextMenu (список);

введите это:       list.setOnCreateContextMenuListener(это);

И вместо функции onContextItemSelected (MenuItem item) используйте это:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню