2010-11-29 23 views
1

Zum Beispiel, wenn ich eine geordnete Menge von Objekten [a, b, c, d, e] mit ihrer Eigenschaft tabIndex richtig zugeordnet haben, und der Schwerpunkt liegt derzeit auf dem Objekt c, möchte ich damit den Fokus ändern:Wie setzt man den aktuellen Tab-Index in Flash zurück?

a) Nichts fokussiert ist;

b) Wenn ich das nächste Mal die Tabulatortaste drücke, wird das Objekt a fokussiert.

stage.focus = null löst (a), merkt sich jedoch den aktuellen Index, der bewirkt, dass das Objekt d fokussiert wird, wenn die Registerkarte gedrückt wird.

Antwort

1

Anstatt zu versuchen, den Index zu ändern, könnten Sie die tabEnabled Eigentum der verbleibenden Objekte auf false wechseln, wenn der Fokus auf der ersten ist objet, aktiviert es erneut.

Dieses Beispiel nicht in Funktionen strukturiert ist, es ist nur Demo-Code zu klären, was ich

var objects:Array = [a , b , c , d , e]; 

    //set a KeyboardEvent listener & 
    //increment the currentIndex value when TAB is pressed 
    var currentIndex:int = -1; 

    //when you need to reset , disable tabEnabled property 
    //for remaining objects & reset the currentIndex 
    for(var i:int ; i < objects.length ; ++i) 
     if(i > currentIndex) 
      objects[i].tabEnabled = false; 
    currentIndex = -1; 
    stage.focus = null; 

Press Register bedeuten wieder liegt der Schwerpunkt auf einer

 //enable objects 
    for(var i:int ; i < objects.length ; ++i) 
      objects[i].tabEnabled = true; 
+0

Schöne Workaround. Ich werde damit gehen, da es anscheinend keine Möglichkeit gibt, den Index zu ändern. – lzm

0

der einfachste Weg ist imho Fokus auf e zu setzen und dann zu null

+0

Das funktioniert nicht, der Index des Objekts, das zuletzt "Tabstopp" war, wird immer noch von Flash verwendet. – lzm

0

Ich bin nicht sicher, dass dies der beste Weg, um darüber zu gehen, aber es funktioniert auf jeden Fall. Grundsätzlich behalten Sie den Überblick über das fokussierte Oberflächenelement. Bevor Sie den Fokus auf Null setzen, speichern Sie das aktuell fokussierte Element. Werfen Sie einen Blick - Getestet habe ich diese mit ein paar TextInputs und einem Button:

// you should change the wildcard datatype to match your UI elements 
var currentFocus:*; 
var lastFocus:*; 

btn.addEventListener(MouseEvent.CLICK, onClick); 
function onClick(evt:MouseEvent):void{ 

    // store the element currently in focus 
    // so that we can re-select it next time tab is hit 
    lastFocus = currentFocus; 
    // setting stage.focus = null will lost keyboard focus 
    // so we set it to stage 
    stage.focus=stage 
} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyReleased); 
function onKeyReleased(evt:KeyboardEvent):void{ 

    if (evt.keyCode == Keyboard.TAB){ 

    // if lastFocus exists, set the stage focus accordingly 
    // update currentFocus and then set lastFocus to null 
     if (lastFocus){ 
     stage.focus = lastFocus; 
     currentFocus = lastFocus; 
     lastFocus = null; 
     } else { 
     // keep track of current focus 
     currentFocus = stage.focus; 
     } 
    } 
} 
0

Diese Lösung nicht zu verändern erfordert der tabIndex der Elemente in der Registerkartenschleife.

dann den folgenden Code zu Ihrem Projekt hinzufügen:

import flash.events.FocusEvent; 

var tab_resetter:MovieClip = new MovieClip(); 
tab_resetter.tabIndex = 9999; 
tab_resetter.addEventListener(FocusEvent.FOCUS_OUT, function() { 
    stage.removeChild(tab_resetter); 
}); 

function resetTabIndex():void { 
    stage.addChild(tab_resetter); 
    stage.focus = tab_resetter; 
} 

Da tab_resetter ist nicht auf der Bühne die meiste Zeit, wird es nicht Teil der normalen Tabulatorschleife sein. Sobald Sie resetTabIndex() aufrufen, wird tab_resetter in die Registerkartenschleife eingefügt und Fokus gegeben. Wenn Sie tab_resetter einen ausreichend hohen tabIndex Wert geben, wird das Klicken auf den Tab nach dem Aufruf von resetTabIndex() den Fokus auf das erste Element in der Registerkartenschleife legen.

Verwandte Themen