2013-04-10 8 views
11

Ich habe einen Dialog, der eine Liste von Elementen zeigt, ich muss in der Lage sein, Elemente in dieser Liste zu bearbeiten/zu löschen, also setze ich ein Kontextmenü, wenn der Benutzer lange auf eine drückt Sie können wählen, was sie tun möchten (Bearbeiten oder Löschen des Elements).onContextItemSelected wird nicht in einem DialogFragment aufgerufen

Das Problem ist, dass onContextItemSelected nie aufgerufen wird, wenn ein Element im Kontextmenü ausgewählt ist.

Ich überprüfte, ob die Aktivität, die das Dialogfragment erstellt hat, vielleicht den Callback bekommt, aber das ist auch nicht so warum wird es nicht aufgerufen? Können Sie in einem Dialog kein Kontextmenü erstellen?

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

die unten Antwort wählen, es – Nasrudeen

+0

Wahrscheinlich die Hosting-Aktivität hat 'onContextItemSelected' Implementierung arbeitet, die nicht' super' nicht nennen. Das war das Problem in meinem (etwas ähnlichen) Fall. – Stan

Antwort

29

Für alle noch für dieses Problem zu umgehen suchen, löste ich nur dieses Problem, indem eine anonyme OnMenuItemClickListener schaffen, die Delegierten zurück zu onContextItemSelected(MenuItem item) und es auf alle Elemente in meinem Menü.

@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

Incredible ... Ist das ein Fehler im Framework oder wird dies ohne eine solche Abhilfe nicht unterstützt? – mgalgs

+0

So oder so, es ist noch ein weiterer Grund für mich, weg von Android, kann ich diese Problemumgehung nicht verwenden, da mein Dialogfeld als kein Dialogfragment in einem anderen Bildschirm verwendet wird und dies 2 Aufrufe –

+1

Dies kann nicht wahr sein .. Ich habe das gerade gefunden, und es hat mein Problem gelöst, warum onContextItemSelected nicht aufgerufen wurde .. +1 Sie würden denken, dass sie es für mehr als 3 Jahre reparieren würden. – andyADD