2013-04-10 18 views
11

Mam okno dialogowe, które pokazuje listę elementów, potrzebuję móc edytować/usuwać elementy z tej listy, więc umieszczam menu kontekstowe, aby użytkownik długo naciskał na pozycja, w której mogą wybrać, co chcą zrobić (edytować lub usunąć przedmiot).Funkcja onContextItemSelected nie jest wywoływana w DialogFragment

Problem polega na tym, że onContextItemSelected nigdy nie jest wywoływany, gdy wybrany jest element w menu kontekstowym.

Sprawdziłem, czy może aktywność, która utworzyła fragment okna, odbiera callback, ale tak też nie jest, dlaczego nie jest wywoływana? Czy nie możesz zrobić menu kontekstowego w oknie dialogowym?

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

}

+0

wybrać poniżej odpowiedź, że działa – Nasrudeen

+0

Prawdopodobnie aktywność gospodarzem ma 'onContextItemSelected' realizację którego nie nazywa' super'. To był problem w moim (nieco podobnym) przypadku. – Stan

Odpowiedz

29

Dla każdego nadal szuka obejść, po prostu rozwiązać ten problem poprzez stworzenie anonimowego OnMenuItemClickListener aby delegaci z powrotem do onContextItemSelected(MenuItem item) i ustawienie go na wszystkie elementy w moim menu.

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

Niewiarygodne ... Czy jest to błąd w ramach, czy to naprawdę nie jest obsługiwane bez obejścia tego typu? – mgalgs

+0

Tak czy inaczej jest to kolejny powód, dla którego mogę odejść od Androida, nie mogę użyć tego obejścia, ponieważ moje okno dialogowe jest używane jako fragment bez żadnego dialogu na innym ekranie, a to spowodowałoby 2 inwokacje –

+1

To nie może być prawda .. Znalazłem to i rozwiązało ono mój problem, dlaczego nie był wywoływany onContextItemSelected .. +1 Myślałbyś, że przez 3 lub więcej lat go naprawią. – andyADD