onContextItemSelected не вызывается в DialogFragment

У меня есть диалоговое окно, в котором отображается список элементов, мне нужно иметь возможность редактировать/удалять элементы в этом списке, поэтому я добавляю контекстное меню, поэтому, когда пользователь долго нажимает на элемент, он может выбрать, что они хотят сделать ( изменить или удалить элемент).

Проблема в том, что onContextItemSelected никогда не вызывается при выборе элемента в контекстном меню.

Я проверил, может быть, действие, создавшее фрагмент диалога, получает обратный вызов, но это не так, так почему же оно не вызывается? Нельзя ли сделать контекстное меню в диалоге?

public class TypesDialogList extends DialogFragment implements LoaderManager.LoaderCallbacks<Cursor>,OnItemClickListener,OnCreateContextMenuListener{

ListView lv;
SimpleCursorAdapter mAdapter;
private int EDIT_TYPE = 1;
private int DELETE_TYPE = 2;
OnEditType mType;


public Dialog onCreateDialog(Bundle state){
    final View v = getActivity().getLayoutInflater().inflate(R.layout.layer_dialog_layout, null, false);
    lv = (ListView)v.findViewById(R.id.listView1);
    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    lv.setOnItemClickListener(this);
    lv.setOnCreateContextMenuListener(this);
    return new AlertDialog.Builder(getActivity()).setView(v).setPositiveButton("Add Type", new OnClickListener(){

        public void onClick(DialogInterface dialog, int which) {

        }

    }).setTitle("Type's").create();
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){
    super.onCreateContextMenu(menu, v, menuInfo);
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    long id = info.id;
    if(id > 3){
        menu.setHeaderTitle("Type Menu");
        menu.add(Menu.NONE, EDIT_TYPE, 1, "Edit");
        menu.add(Menu.NONE, DELETE_TYPE, 2, "Delete");
    }else{
        Toast.makeText(getActivity(),"Cannot edit type",Toast.LENGTH_SHORT).show();
    }

}

@Override
public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);
     AdapterView.AdapterContextMenuInfo oMenuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
     long id = oMenuInfo.id;
     if(item.getItemId() == EDIT_TYPE){

     }else if(item.getItemId() == DELETE_TYPE){

     }
     return true;
 }

}


person tyczj    schedule 10.04.2013    source источник
comment
выберите ответ ниже, он работает   -  person Nasrudeen    schedule 16.11.2014
comment
Вероятно, активность хостинга имеет onContextItemSelected реализацию, которая не вызывает super. Это была проблема в моем (несколько похожем) случае.   -  person Stan    schedule 14.01.2015


Ответы (1)


Для тех, кто все еще ищет обходной путь, я просто решил эту проблему, создав анонимный OnMenuItemClickListener, который делегирует обратно onContextItemSelected(MenuItem item), и установив его для всех элементов в моем меню.

@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
    // Creation/inflate menu here

    OnMenuItemClickListener listener = new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            onContextItemSelected(item);
            return true;
        }
    };

    for (int i = 0, n = menu.size(); i < n; i++)
        menu.getItem(i).setOnMenuItemClickListener(listener);
}
person Raider    schedule 17.09.2013
comment
Невероятно... Это ошибка в фреймворке или это действительно не поддерживается без обходного пути? - person mgalgs; 10.01.2015
comment
В любом случае это еще одна причина для меня отказаться от Android, я не могу использовать этот обходной путь, потому что мой диалог используется как фрагмент диалога без диалога на другом экране, и это вызовет 2 вызова. - person alex.p; 23.07.2015
comment
Это не может быть правдой... Я только что нашел это, и это решило мою проблему, почему onContextItemSelected не вызывался.. +1 Можно подумать, что за 3 с лишним года они это исправят. - person andyADD; 17.05.2016