2011-05-27 4 views
3

J'ai fait une application simple qui vient d'ouvrir un AlertDialog, avec quatre éléments dans la liste. J'enregistre un menu contextuel. Lorsque je clique longtemps sur l'un des éléments, j'obtiens le menu contextuel. Je sélectionne ensuite un élément dans le menu contextuel, mais onContextItemSelected n'est jamais appelé. De l'aide? Merci.onContextItemSelected ne se fait pas appeler

test.java:

package com.cerulean.tech.creations.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.ContextMenu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 

public class test extends Activity { 

    private String[] files; 
    AlertDialog alert; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     files = new String[4]; 
    } 

    public void selectScheme(View v) { 
     files[0] = "<New Scheme>"; 
     files[1] = "test1"; 
     files[2] = "test2"; 
     files[3] = "test3"; 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setItems(files, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int item) { 
        }}); 
     alert = builder.create(); 
     alert.show(); 
     registerForContextMenu(alert.getListView()); 
    } 


    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Context Menu"); 
     menu.add(0, v.getId(), 0, "Delete"); 
     menu.add(0, v.getId(), 0, "Cancel"); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     return false; 
    } 
} 

En main.xml, je viens d'un bouton défini avec Android: onclick = "selectScheme"

Répondre

9

Après cette ligne:

registerForContextMenu(alert.getListView()); 

Type cette :

alert.getListView().setOnCreateContextMenuListener(this); 

Et au lieu de la fonction onContextItemSelected (point MenuItem) utiliser:

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem menuItem) { 
+0

Je veux juste dire que je l'ai passé beaucoup de temps sur cette question et votre réponse est celle qui a seulement travaillé. J'ai d'abord essayé les 20 autres solutions possibles en premier. Pour ceux qui pourraient ne pas comprendre, oui, déplacez le code de onContextItemSelected vers la méthode onMenuItemSelected. Et puis supprimez la méthode onContextItemSelected. – Bryan

4

La fonction suivante obtient toujours exécutée.

public boolean onMenuItemSelected(int featureId, MenuItem menuItem) 

Mais vous pouvez différencier les menus contextuels et des menus d'options en utilisant les drapeaux suivants:

if (featureId == Window.FEATURE_CONTEXT_MENU) 
{ 
//Do something 
} 
else if (featureId == Window.FEATURE_OPTIONS_PANEL) 
{ 
//Do something else 
} 
-1

La vraie cause de ce problème est que vous surchargeons onContextItemSelected et ne pas appeler super.onContextItemSelected. Changer votre méthode onContextItemSelected à ceci:

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if (super.onContextItemSelected(MenuItem item)) 
     return true; 
    return false; 
} 
+4

Si ce n'est pas encore appelé alors comment est-ce le problème ?? – tyczj

0

Je veux construire sur la réponse de Miki.

Je ne ai utilisé

registerForContextMenu(this.getListView()); 

et

this.getListView().setOnCreateContextMenuListener(this); 

dans ma classe ListActivity mère.

je me suis déplacé mon code de la onContextItemSelected (point MenuItem) méthode la méthode onMenuItemSelected.

@Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    try { 
     if (item.getItemId() == R.id.new_entry_menu_option) { 

     ... 

     } 

     ... 

     if (item.getItemId() == R.id.quit) { 
     /* perform cleanup */ 
     ... 
     return true; 
     } else if (item.getItemId() == R.id.delete_entry_context_menu_option) { 
     displayConfirmRequest(DELETE_CONFIRMATION_MESSAGE, item); 
     return true; 
     } else if (item.getItemId() == R.id.2ND_CONTEXT_OPTION) { 
     //code for 2nd option 
     return true; 
     } else if (item.getItemId() == R.id.3RD_CONTEXT_OPTION) { 
     //code for 3RD option 
     return true; 
     } else { 
     return super.onMenuItemSelected(featureId, item); 
     }// end if/else if/else 
    }// end try 
    catch (Exception error) { 
     //error handler code 
     return false; 
    }// end try/catch 
    }// end onMenuItemSelected 

Et assurez-vous que dans votre sous-classe, si vous override onMenuItemSelected dans la sous-classe de votre super.ListActivity classe, d'inclure le code suivant si vous voulez que les options de ContextMenu à traiter dans le super .classe.

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    if (<condition>) { 

    ... 

    } else { 
    return super.onMenuItemSelected(featureId, item); 
    } 
}// end onMenuItemSelected 
1

Just Add

@Override 
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) { 
    if (aFeatureId==Window.FEATURE_CONTEXT_MENU) 
     return onContextItemSelected(aMenuItem); 
    else 
     return super.onMenuItemSelected(aFeatureId, aMenuItem); 
} 
+0

Merci, je cherchais cette solution depuis une semaine. –

Questions connexes