2013-04-10 16 views
11

Ho una finestra di dialogo che mostra un elenco di elementi, ho bisogno di essere in grado di modificare/eliminare elementi in questo elenco in modo da mettere un menu contestuale in modo che quando l'utente preme a lungo elemento in cui possono scegliere cosa vogliono fare (modificare o eliminare l'elemento).onContextItemSelected non viene chiamato in un DialogFragment

Il problema è che onContextItemSelected non viene mai chiamato quando viene selezionato un elemento nel menu di scelta rapida.

Ho controllato se forse l'attività che ha creato il frammento di dialogo sta ricevendo la richiamata, ma non è così, perché non viene chiamata? Non puoi fare un menu contestuale in una finestra di dialogo?

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

selezionare la risposta qui sotto, si sta lavorando – Nasrudeen

+0

probabilmente l'attività di hosting ha 'implementazione onContextItemSelected' che non richiede' super'. Questo era il problema nel mio caso (un po 'simile). – Stan

risposta

29

Per chiunque ancora alla ricerca di una soluzione, ho appena risolto questo problema con la creazione di un anonimo OnMenuItemClickListener che i delegati di nuovo a onContextItemSelected(MenuItem item) e l'impostazione su tutti gli articoli nel mio 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

Incredibile ... Si tratta di un bug nel framework o questo non è davvero supportato senza soluzione alternativa come questa? – mgalgs

+0

Ad ogni modo è ancora un altro motivo per me di allontanarmi da Android, non posso usare questa soluzione alternativa perché la mia finestra di dialogo è usata come frammento di una finestra di dialogo in nessun altro schermo e ciò causerebbe 2 invocazioni –

+1

Questo non può essere vero .. Ho appena trovato questo, e ha risolto il mio problema perché onContextItemSelected non veniva chiamato .. +1 Penseresti che per 3+ anni lo risolverebbero. – andyADD