NOTA: Poiché questa risposta sembra ricevere un po 'di attenzione (upvotes), sto modificando il frammento di codice per riflettere una risposta più concisa alla domanda.
Si sta tentando di registrare il menu di scelta rapida per un elemento della vista all'interno della finestra di dialogo ma dall'attività. Questo approccio è sbagliato. In realtà devi sottoclasse la finestra di dialogo e quindi creare ed espandere le tue visualizzazioni lì, quindi sovrascrivere il onCreateContextMenu() lì per fare il tuo lavoro e registrare la tua vista per il menu contestuale. Dovresti quindi creare un'istanza di quella finestra qui. Così sarà qualcosa del tipo:
public class Mydialog extends Dialog {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.popup);
dialog.setTitle(R.string.msettings);
RelativeLayout reply_layout = (RelativeLayout) findViewById(R.id.reply_layout);
final RelativeLayout ringtone_layout = (RelativeLayout) findViewById(R.id.ringtone_layout);
registerForContextMenu(ringtone_layout);
ringtone_layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openContextMenu(ringtone_layout);
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 1, "Delete");
}
// You should do the processing for the selected context item here. The
// selected context item gets passed in the MenuItem parameter in
// the following method. In my answer I am force calling the onContextItemSelected()
// method but you are free to do the actual processing here itself
@Override
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
if (aFeatureId==Window.FEATURE_CONTEXT_MENU)
return onContextItemSelected(aMenuItem);
else
return super.onMenuItemSelected(aFeatureId, aMenuItem);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Avoid using System.out.println() - instead use Android Logging
return super.onContextItemSelected(item);
}
}
Ora, è possibile creare un'istanza di questa finestra di dialogo e le vostre opinioni avrà la voce di contesto registrato con successo. Così il vostro openDialogMethod() sarà ora simile:
private void opendialog() {
dialog = new MyDialog(MainActivity.this);
// the context menu will now be registered
dialog.show();
}
Anche se si erano originariamente passando il contesto dell'attività per la finestra di dialogo che si vuole creare, non si può passare dal menu contestuale ascoltatori di creazione del genere. Per farlo dovrai sottoclassi la finestra di dialogo come mostrato sopra.
EDIT: Dopo aver esaminato la risposta di Zsolt, ho scoperto che trascuravo questa riga di codice che non avevi. È necessario disporre di:
ringtone_layout.setOnCreateContextMenuListener(this);
quello che dici con forza di chiamare il menu contestuale è effettivamente vero. Stai solo chiamando il menu normale e quindi stai passando quell'ID al callback del menu contestuale. La clausola if passa perché l'id è dalla funzione del menu di scelta rapida.
E dopo qualche ulteriore lettura, sembra che si debba eseguire la gestione dei menu su onMenuItemSelected() e non su onContextItemSelected(). Quindi quello che hai ora è corretto e non hai bisogno di chiamare con forza l'altro metodo. Esegui semplicemente la tua elaborazione in onMenuItemSelected().
ho seguito esattamente quello che hai detto, ma ancora il 'non onContextItemSelected' chiamare ma molto grazie alla vostra risposta. ma come puoi vedere nella mia risposta, dopo aver selezionato un elemento in 'onCreateContextMenu' il flusso di codice sta per' onMenuItemSelected' @Sunil –
Apre il menu di scelta rapida nel listener onClick()? inoltre, è necessario utilizzare solo findViewById() - non dialog.findViewById(). Modificherò questo nella mia risposta. Ma puoi dirmi se il menu di scelta rapida si apre quando te lo aspetti? – ucsunil
Sì, il menu di scelta rapida si apre per primo. Ho rimosso il dialog.findviewById. Ho aggiornato la mia risposta con il codice completo. Si prega di avere un controllo .. –