2010-04-29 4 views
1

J'ai un problème lorsque je montre un message AlertBox lorsque l'utilisateur appuie sur ENTRÉE et que le focus est dans une zone de texte. La fenêtre contextuelle fonctionne correctement, mais lorsque l'utilisateur clique, l'alerte se ferme comme prévu, mais l'écouteur TextArea reçoit l'événement ENTER de l'alerte et relance la boîte de dialogue. J'ai essayé un certain nombre de façons d'attraper et de manger l'événement, mais jusqu'à présent, je n'ai pas eu de chance. Est-il possible d'accomplir cela?Dans FLEX, comment pouvez-vous arrêter la touche ENTRÉE de mon alerte interceptée par le contrôle qui a déclenché l'alerte?

public function init():void 
{ 
    myTextInput.addEventListener(KeyboardEvent.KEY_UP, handleKeyStrokes); 
} 

public function handleKeyStrokes(evt:KeyboardEvent):void 
{ 
    if(evt.keyCode == Keyboard.ENTER) 
    { 
     myAlert = Alert.show("This is a test and only a test", "Title", 4, null, alertCallBack); 
    } 
} 

<mx:TextInput id="myTextInput" 
       left="600" top="10"> 

</mx:TextInput> 
+0

En tant que test. J'ai ajouté un écouteur KEY_UP et KEY_DOWN à l'AlertBox et au TextField. Lorsque j'appuie sur Entrée avec mise au point dans le champ de texte, puis sur ENTRÉE à nouveau après l'apparition de l'alerte. Le nombre représente l'événementPhase. texte Entrée 3 keyDown Alert 3 keyUp Alert 3 keyDown texte Entrée 3 keyUp – WeeJavaDude

Répondre

1

Lorsque vous affichez l'alerte, supprimez le programme d'écoute de texte. Ajoutez un écouteur à l'alerte pour sa fermeture et, dans cet écouteur de proximité, rajoutez l'écouteur de texte.

+0

J'ai essayé en supprimant les auditeurs avant de faire le Alert.Show et réintégrant l'auditeur dans la fonction de rappel de l'alerte et quand je l'ai fait l'événement atteignait toujours handleKeyStrokes. L'autre comportement étrange est que j'ai essayé d'ajouter un KEY_UP EventListener pour que l'alerte capture la touche ENTRÉE et ne semble pas se déclencher. Devrait-il? – WeeJavaDude

0

Essayez event.stopImmediatePropagation et event.preventDefault

+0

N'avez pas essayé preventDefault mais avez essayé stopImmediatePropagation et n'a pas réussi. Le problème clé avec lequel je suis aux prises est que la source de l'alerte a un écouteur d'événement qui cherche la touche ENTRÉE de sorte que je dois arrêter l'événement au point d'alerte ou être capable de faire la différence entre l'entrée faite dans le contrôle et l'ENTRÉE fait à l'alerte. La chose étrange que je vois est que si j'ajoute un écouteur KEY_UP sur l'alerte, il ne se déclenche pas quand j'appuie sur ENTRÉE. – WeeJavaDude

1

Il semble que, après est appelé CloseEvent de l'alerte, un KeyboardEvent est envoyé avec une cible de la zone de texte (si la touche entrée a été utilisée pour fermer l'alerte). Pour résoudre ce problème, j'ai bien aimé l'affiche précédente mentionnée et j'ai supprimé l'écouteur d'événement avant d'afficher l'alerte, mais au lieu d'ajouter immédiatement l'écouteur dans la fonction CloseEvent, je l'ai enveloppé dans un délai de 250 ms. Bien que ce soit une solution merdique, cela a fonctionné.

wEmail.removeEventListener(KeyboardEvent.KEY_UP, AddEmail); 
Alert.show(
    "Email '" + wEmail.text + "' is not valid", 
    "Invalid Email", 
    Alert.OK, 
    Sprite(parentApplication), 
    function(e:CloseEvent):void { 
     //must delay adding because a second Keyboard.ENTER is 
     //dispatched after this function if enter was used to close Alert 
     setTimeout(function():void { 
      wEmail.addEventListener(KeyboardEvent.KEY_UP, AddEmail); 
     }, 250); 
    }, 
    null, 
    Alert.OK 
); 
Questions connexes