6

Juste essayé de tester mon application sur le périphérique réel (HTC Desire Z avec Android 2.2). Et constaté que mes menus contextuels ne fonctionne pas du tout sur EditText s. Sinon, les menus contextuels fonctionnent: en ListView, ImageView et ainsi de suite. Sur l'émulateur, tout fonctionne bien ...onCreateContextMenu() pour EditText ne fonctionne pas sur le périphérique réel

Lorsque j'appuie sur EditText, il affiche quelque chose comme un cadre de zoom, puis affiche un menu contextuel inhabituel (non standard Android) qui lit: "sélectionner le texte", "sélectionner tout". Il ne montre pas mes menus. Voici les captures d'écran:

  1. Before tap
  2. During tap
  3. After tap (tout sélectionner du texte ordinaire, sélectionnez tous, coller)

mais pas mon menu comme dans l'émulateur - look here

Voici le code source de mon activité:

J'ai complètement débogué/connecté tout autour de mon code, mais toujours Activity.onCreateContextMenu() même pas appelé (bien qu'il soit enregistré correctement).

S'il vous plaît aider - ce que cela peut être? Est-ce lié aux particularités de HTC?

+0

Pourriez-vous poster une capture d'écran du menu contextuel? – CommonsWare

+0

Je suis également curieux de voir une capture d'écran de ce que vous voyez. J'ai un désir original et je viens de l'essayer avec mon téléphone et je reçois correctement mon propre menu contextuel avec l'en-tête/titre et mes choix quand j'appuie longuement sur mon EditText. – Squonk

+0

Dès que j'aurai accès au PC de débogage USB activé, je ferai des captures d'écran.Je suppose qu'il se passera aujourd'hui soir (de Moscou/Russie temps) – barmaley

Répondre

7

Oui, je pense que ce que vous voyez il y a un menu HTC.

Le menu contextuel d'édition graphique que vous voyez est, je crois, nouveau sur les modèles Desire plus récents (Desire HD et Desire Z). Ce que je vois (avec votre code) sur mon Desire original est un menu contextuel avec le HeaderTitle défini comme 'Edit text' et une liste comme 'Select all', 'Copy', 'Paste' etc. MAIS, je voyez aussi une entrée disant 'Test menu'.

Il me semble que lorsque onCreateContextMenu() est appelé pour des choses comme ListView et ImageView, l'objet 'menu' transmis à cet appel n'est pas pré-rempli par défaut. Dans le cas d'un EditText, cependant, il est conçu pour interagir avec le Presse-papiers et en tant que tel le système fournit un menu pré-rempli basé sur l'état de contenu EditText (par exemple, si le texte est sélectionné, fournir une option 'Copier'; s'il y a du texte dans le Presse-papiers, donnez une option "Coller", ... et ainsi de suite).

j'ai pu obtenir un menu contextuel sans les options « modifier » en effaçant l'en-tête et le contenu en modifiant votre code ...

@Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 
{ 
    Log.v(TAG, "Creating context menu for view="+view); 

    // Clear current contents 
    menu.clearHeader(); 
    menu.clear(); 

    menu.setHeaderTitle("TEST MENU"); 
    menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "Test menu"); 
    super.onCreateContextMenu(menu, view, menuInfo); 
} 

Le fait que vous obtenez un menu graphique (peut-être dérivé à partir de ContextMenu) suggère que la technique ci-dessus ne fonctionnera pas alors la seule façon de contourner ce problème serait d'instancier votre propre objet ContextMenu plutôt que d'utiliser celui qui est passé à onCreateContextMenu().

J'ai beaucoup débogué/tout autour de mon code connecté, mais toujours Activity.onCreateContextMenu() même pas appelé

Cela semble très étrange - de toute évidence, il est appelé pour moi comme je l'ai été en mesure pour jouer avec le ContextMenu qui lui est passé. En repensant à cela, vous mentionnez que vous appuyez sur le bouton EditText - est-ce ce que vous êtes réellement en train de faire (un appui court puis un appui vers le haut)?

Pour obtenir mon ContextMenu, je dois utiliser une pression longue/cliquer (maintenir enfoncé pendant environ 1 seconde). Quand je tape simplement/touche mon EditText, le clavier 'soft' apparaît ou, si le clavier est déjà visible, le curseur est simplement déplacé à une position différente dans la zone EditText.

De toute évidence, le Desire Z a un clavier physique et cela peut provoquer un comportement légèrement différent (ainsi que le Desire Z ayant une version différente de l'interface de détection à mon désir). Le fait que onCreateContextMenu() ne soit jamais appelé ne peut signifier qu'une seule chose et que, ce que vous voyez n'est pas un ContextMenu et est un autre type d'élément d'interface utilisateur contextuel. Au moins, c'est la seule façon logique de le comprendre.

Pouvez-vous confirmer qu'un appui long ne crée pas de ContextMenu pour vous ou avez-vous utilisé une pression longue tout au long?

Si vous avez essayé une longue pression puis essayer de modifier le code comme suit ...

  1. Mettre en œuvre OnClickListener

    public class MyActivity extends Activity 
        implements OnLongClickListener { 
    
  2. Réglez l'auditeur pour editText dans onCreate ...

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        editText=(EditText)findViewById(R.id.editText); 
        this.registerForContextMenu(editText); 
        editText.setOnLongClickListener(this); // <-- ADD THIS 
    } 
    
  3. Ajouter le code d'écoute ...

    @Override 
    public boolean onLongClick(View arg0) { 
        android.util.Log.v(TAG, "onLongClick() called"); 
        if (arg0 == editText) 
        { 
         android.util.Log.v(TAG, "arg0 == editText"); 
          Toast.makeText(this, "onLongClick intercepted", 2000).show(); 
         return true; 
        } 
        else 
        { 
         android.util.Log.v(TAG, "arg0 != editText"); 
         return false; 
        } 
    } 
    

En faisant cela, je suis en mesure d'intercepter la longue presse et, en retournant « true » de onLongClick() J'indiquant au système que je suis « consumé » l'événement et il n'est pas transmis pour provoquer la création de mon ContextMenu.

Si cela ne fonctionne pas pour vous et qu'un raccourci entraîne toujours l'apparition de cette fenêtre, essayez d'implémenter OnClickListener et de surcharger onClick() à la place.

L'objet de l'exercice est que si vous pouvez intercepter tout ce qui provoque la création de la fenêtre contextuelle que vous voyez, vous pouvez ensuite créer manuellement et afficher votre propre ContextMenu.

+0

Thanx Je vais vérifier vos idées ... – barmaley

+0

Non, il n'appelle pas onCreateContextMenu() - J'ai tout vérifié tout double. S'il vous plaît aider! Des idées? – barmaley

+0

@barmaley: Voir ma réponse vers la fin où je commence EDIT 1: – Squonk