ContextMenu в диалоге - PullRequest
       15

ContextMenu в диалоге

2 голосов
/ 02 января 2011

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

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;

}

Ответы [ 3 ]

2 голосов
/ 26 июня 2013

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

@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 голос
/ 26 июля 2012

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

1 голос
/ 03 июня 2011

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

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

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

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