2015-04-12 12 views
14
Dialog dialog; 

private void opendialog() { 
    dialog = new Dialog(MainActivity.this); 
    dialog.setContentView(R.layout.popup); 
    dialog.setTitle(R.string.msettings); 
    RelativeLayout reply_layout = (RelativeLayout) dialog 
      .findViewById(R.id.reply_layout); 
    final RelativeLayout ringtone_layout = (RelativeLayout) dialog 
      .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"); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    System.out.println("Inside onContextItemSelected"); 
    return super.onContextItemSelected(item); 
} 

onContextItemSelected non viene mai chiamato quando si utilizza il menu di scelta rapida all'interno di una finestra di dialogo. C'è qualcosa di sbagliato nel mio codice? Grazie in anticipo ..onContextItemSelected non viene attivato quando viene chiamato dalla finestra di dialogo

risposta

7

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().

+0

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 –

+0

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

+0

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 .. –

1
public class MusicsetDialog extends Dialog implements OnClickListener { 
    private RelativeLayout ringtone_layout; 

    public MusicsetDialog(Context context) { 
     super(context); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.music_popup); 
     setTitle(R.string.msettings); 

     ringtone_layout = (RelativeLayout) findViewById(R.id.ringtone_layout); 

     ringtone_layout.setOnClickListener(MusicsetDialog.this); 

     registerForContextMenu(ringtone_layout); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.ringtone_layout: 
      openContextMenu(ringtone_layout); 
      break;   
     default: 
      break; 
     } 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     menu.setHeaderTitle("Select The Action"); 
     // groupId, itemId, order,title 
     menu.add(0, v.getId(), 0, "Edit"); 
     menu.add(0, v.getId(), 1, "Delete"); 
     super.onCreateContextMenu(menu, v, menuInfo); 
    } 

    @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) { 
     // System.out.println("onContextItemSelected"); 
     Log.d("MusicsetDialog", "onContextItemSelected"); 
     return super.onContextItemSelected(item); 
    } 
} 

Ho creato una sottoclasse per mydialog e la finestra di dialogo estesa e ho seguito la procedura di Sunil. Ma ancora onContextItemSelected non è stato chiamato. quindi dopo aver fatto qualche ricerca, ho ignorato onMenuItemSelected e passato il MenuItem selezionato a onContextItemSelected e ha funzionato bene. potrebbe essere che sto chiamando con forza onContextItemSelected. Non lo so. Sono nuovo di Android, alcuna spiegazione perché onContextItemSelected non è ancora chiamato automaticamente sarebbe apprezzato .. Grazie ..

+0

In effetti stai forzando la chiamata a onContextItemSelected(). In primo luogo, il menu di scelta rapida viene visualizzato? – ucsunil

+1

Ho aggiornato la mia soluzione. Non è necessario utilizzare il metodo onContextItemSelected(). Non sembra che si chiami quando si fa clic sulla voce di menu contestuale – ucsunil

4

Questo problema già risolto nei seguenti SO discussioni: onContextItemSelected doesn't get called e onContextItemSelected never called using a Dialog with a ListView.

Se nessuna delle risposte che ha aiutato, provare questo: return false in onContextItemSelected metodo nella attività e nei suoi frammenti .

+0

Ho già controllato quelle risposte, non sto usando la visualizzazione elenco, sto passando a Relativelayout per la registrazione di un server. Il mio problema in se 'onContextItemSelected 'non viene chiamato ma mi stai dicendo di aggiungervi un'istruzione di retune. Come avrà senso. Comunque grazie per la tua risposta. –

+0

Ha senso, perché l'attività oi suoi frammenti possono catturare l'onContextItemSelected prima che tu possa prenderlo. –

1

Prova questa

new AlertDialog.Builder(this) 
     .setSingleChoiceItems(items, 0, null) 
     .setPositiveButton(R.string.ok_button_label, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       dialog.dismiss(); 
       int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); 
       // Do something useful withe the position of the selected radio button 
      } 
     }) 
     .show(); 
Problemi correlati