¿Cómo establecer programáticamente el foco en HorizontalList para que pueda recibir eventos clave (Flex)?
-
06-07-2019 - |
Pregunta
Por favor, mire el código:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:creationComplete>
<![CDATA[
list.setFocus();
]]>
</mx:creationComplete>
<mx:HorizontalList id="list">
<mx:creationComplete>
<![CDATA[
setFocus();
]]>
</mx:creationComplete>
<mx:focusIn>
<![CDATA[
trace("Received focus");
]]>
</mx:focusIn>
<mx:keyDown>
<![CDATA[
trace("Key down");
]]>
</mx:keyDown>
<mx:dataProvider>
<mx:Object label="Some"/>
<mx:Object label="Different"/>
<mx:Object label="Stuff"/>
</mx:dataProvider>
</mx:HorizontalList>
Como puede ver, trato de enfocar mi HorizontalList
cuando se carga la aplicación. Y en realidad recibo el mensaje Enfoque recibido
en la consola. Pero esperaba poder navegar sobre los elementos de la lista con las teclas de flecha después de establecer el foco. Pero ese no es el caso. Funcionan solo después de hacer clic en el componente con el mouse. Entonces, ¿qué estoy haciendo mal? ¿Cómo hacer que la lista tenga foco y responda a las teclas de flecha?
Solución
¿Su aplicación se ejecuta dentro de un navegador? Es posible que tenga que establecer el foco en el objeto SWF (a través de JavaScript) para comenzar a interactuar con él sin hacer clic primero en el objeto.
Por ejemplo, suponiendo que esté utilizando Flex Builder, intente agregar una línea como esta al final de la etiqueta SCRIPT de su archivo index.template.html:
window.onload = function()
{
document.getElementById("${application}").focus();
};
Es posible que necesite hacer un pequeño ajuste dependiendo de su situación específica, pero ese es probablemente el problema. Establecer el foco en el objeto Flash explícitamente debería ser el truco. Espero que ayude!
Otros consejos
Ejecuté su código y pude navegar por la lista con el teclado sin hacer clic en la lista primero, pero tuve que hacer clic en algún lugar de la aplicación flexible para que recibe el foco en primer lugar. Creo que es una limitación del flash en general: el SWF no recibirá el foco del teclado a menos que haga clic en algún lugar (aunque mouseOver todavía se disparará).