Flex-ItemRenderer-verhindert, dass die Verwendung der Tabulatortaste zwischen text-inputs
Habe ich eine benutzerdefinierte ItemRenderer zeigt, dass 5 text-Eingaben in jeder der 3 Platten:
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox
xmlns:mx="http://www.adobe.com/2006/mxml"
height="300"
width="800"
creationComplete="onCreationComplete()"
>
<!-- code-behind -->
<mx:Script source="ChainListRenderer.mxml.as" />
<mx:Label text="{data.title}" fontSize="25" fontWeight="bold" width="100%" textAlign="center" />
<mx:HBox>
<mx:Panel id="triggerPanel" title="Trigger" width="260">
<mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="trigger1" width="100%" textAlign="left" tabIndex="0" tabEnabled="true" />
<mx:TextInput id="trigger2" width="100%" textAlign="left" tabIndex="1" tabEnabled="true" />
<mx:TextInput id="trigger3" width="100%" textAlign="left" tabIndex="2" tabEnabled="true" />
<mx:TextInput id="trigger4" width="100%" textAlign="left" tabIndex="3" tabEnabled="true" />
<mx:TextInput id="trigger5" width="100%" textAlign="left" tabIndex="4" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
<mx:Panel id="linkPanel" title="Link" width="260">
<mx:VBox id="lpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="link1" width="100%" textAlign="left" tabIndex="5" tabEnabled="true" />
<mx:TextInput id="link2" width="100%" textAlign="left" tabIndex="6" tabEnabled="true" />
<mx:TextInput id="link3" width="100%" textAlign="left" tabIndex="7" tabEnabled="true" />
<mx:TextInput id="link4" width="100%" textAlign="left" tabIndex="8" tabEnabled="true" />
<mx:TextInput id="link5" width="100%" textAlign="left" tabIndex="9" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
<mx:Panel id="answerPanel" title="Answer" width="260">
<mx:VBox id="apBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="answer1" width="100%" textAlign="left" tabIndex="10" tabEnabled="true" />
<mx:TextInput id="answer2" width="100%" textAlign="left" tabIndex="11" tabEnabled="true" />
<mx:TextInput id="answer3" width="100%" textAlign="left" tabIndex="12" tabEnabled="true" />
<mx:TextInput id="answer4" width="100%" textAlign="left" tabIndex="13" tabEnabled="true" />
<mx:TextInput id="answer5" width="100%" textAlign="left" tabIndex="14" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
</mx:HBox>
</mx:VBox>
Leider, wenn verwendet, als ItemRenderer, Navigation mit der Tabulatortaste zwischen den text-Eingänge nicht funktioniert, auch mit der tabIndex-Werte vor. Wenn ich diesen code kopieren, um eine MXML-Anwendung seiner eigenen, automatisches tabbing zwischen Texteingaben funktioniert wie erwartet.
Weiß jemand, wie die Wiederherstellung der Navigation mit der Tabulatortaste in diesem Szenario? Es wird eine Schande sein wenn ich die Version dieser app ohne eine so einfache usability-element.
Ich nehme an, ich kann die Notwendigkeit zur Umsetzung mx.managers.IFocusManagerComponent
, aber ich finde keine Beispiele auf, wie das zu tun, und die FocusManager-docs nicht helfen, entweder.
- Haben Sie versucht, die Einstellung tabEnabled auf die textInputs?
- Ich versuchte, das gerade jetzt, es scheint nicht zu helfen.
- Wenn Sie sagen, die "Registerkarte Indizierung funktioniert nicht" Verhalten, was sehen Sie? Es tut springen auf die nächste Kontrolle nach Ihr-List-basierte Komponente oder ist es die Tab rund um den browser chrome?
- Die ItemRenderer-oben in einer HorizontalList-Steuerelement. Wenn eine TextInput-Steuerelemente über den Fokus hat und ich die tab-Taste drücken, springt der Fokus außerhalb des HorizontalList-Steuerelement und der nächsten Kontrolle der Anwendung auf die Leinwand. Schlagen tab ein paar mal mehr macht-Zyklus bis über den browser steuert, wie die Adresse bar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich mit einer mx:VBox als benutzerdefinierte itemRenderer-mit rendererIsEditor="true" für mein datagrid, und ich lief in die tab-Reihenfolge-Problem als gut.
Was ich herausgefunden habe, ist, dass der itemRenderer muss die IFocusManagerComponent implementieren, um für die Haupt-Anwendung FocusManager (), um in der Lage sein Reiter richtig zu. Ich habe versucht, die Implementierung der Schnittstelle:
...und es stellt sich eher Komplex zu tun...viele Funktionen für Schnittstellen zu implementieren.
Aber in meinem Fall hatte ich Glück; ich hatte nur ein TextInput-element in meinem itemRenderer (der rest war alles nur custom code, Prüfungen & formatter) so wandelte ich meine itemRenderer von mx:VBox mx:TextInput (die bereits implementiert, die IFocusManagerComponent -):
Voila! Meine tab-Reihenfolge-Problem wurde behoben.
Ich vermute, dass der Abschluss für diejenigen von Ihnen mit mehr komplexen itemRenderers ist, müssen Sie entweder vollständig zu implementieren, die IFocusManagerComponent-Schnittstelle in Ihre Klasse...die ist wahrscheinlich gut, weil es aussieht wie Sie es sagen würden, flex, wie zu custom-tab durch Ihren itemRenderer-Felder. Oder könnten Sie vielleicht ändern Sie Ihre top-level-tag, um etwas, das bereits die Schnittstelle implementiert, z.B.: könnten Sie das nest der mx:VBox in etwas wie:
...und funktioniert vielleicht? Jemand mit komplexeren code als ich sollte ihm einen Versuch geben und sehen, was passiert.
Ich lief in das gleiche problem mit einem itemRender bei "ListBase abgeleitete" Komponente.
Ich fand, dass alle "ListBase abgeleitete" Komponenten wickeln Sie alle Artikel rendereres in einem ListBaseContentHolder.
Aus der ListBase-Quelle:
Den tabChildren und tabEnabled Eigenschaften dieser Klasse sind standardmäßig auf false festgelegt. Die einzige Lösung die ich finden konnte, war die Erstellung einer MyList Komponente, die sich aus der Liste und überschreiben Sie die Methode createChildren (wo die listContent initialisiert wird) auf diese Weise:
Dann mit "<MyList tabChildren="true"/>" statt "<mx:List/>" Komponente gab mir wieder die Tab-functionnality in der ItemRender.
Hoffe es hilft,
Ich denke, ich kann mich in die richtige Richtung, aber ich bin nicht ganz dort noch.
Habe ich meine Haupt-Anwendung, mit der HorizontalList mithilfe einer benutzerdefinierten ItemRenderer:
Habe ich aktualisiert, der code in der ursprünglichen Frage enthalten die gesamte MXML-ItemRenderer (anwendbare Teile); und hier ist der ActionScript-code-behind:
Im wesentlichen, was ich bin versucht zu tun, hier ist re-implementieren der tabbing-Reihenfolge, indem Sie die TAB-Taste key_down-Ereignis hinzu jedes Textfeld, und verschieben Sie den Fokus auf die nächste TextInput (Umhüllung zu der ersten TextInput aus dem letzten). Dies nicht den gewünschten Effekt haben, aber, und der Fokus springt immer noch raus auf die nächste Kontrolle außerhalb dieser HorizontalList.
Irgendwelche Ideen, wo von hier aus gehen?
Warum machst du tabChildren="false"? Wollen Sie nicht auf der Registerkarte die Kinder der HorziontalList? da die itemRenderer-ist ein Kind von der Liste....
Dieser scheint einfach nicht möglich zu sein, mit der Methode war ich mit. Anstelle der Verwendung einer Liste mit einem benutzerdefinierten Elementrenderer wechselte ich zu einem single-item view-Komponente und eine separate übersicht zeigt eine Zusammenfassung von allen Elementen, und diese lassen Sie mich fix mein problem.
Ich hatte das gleiche problem, löste es, indem Sie versuchen, zu implementieren das Verhalten der tab-Taste. Der Schlüssel zum Erfolg ist einfach die
event.preventdefault()
Methode. Der code verwendet wird, gezeigt vor.Dies ist, wie es unten mit einer ComboBox itemEditor:
http://blog.flexmonkeypatches.com/2008/02/18/simple-datagrid-combobox-as-item-editor-example/
Ich hatte die gleichen Probleme der Navigation mit der Tabulatortaste eine der itemRenderer in meinem AdvancedDataGrid - (by the way, bin ich mit dem Flex SDK 3.5), aber dieser Beitrag war extrem hilfreich, damit ich mich um mein tab-freundlich itemRenderer-so möchte ich einen Beitrag als gut 🙂
Machen diese zu arbeiten, müssen Sie auch ändern Sie einige Eigenschaften für das raster und gridColumn.
Let ' s 1. Rede über das raster und gridColumn.
Wie Sie alle wissen, wenn Sie das raster "editable" - Eigenschaft auf "true" können Sie die Registerkarte durch jede Spalte, Zelle (vorausgesetzt, Sie haben nicht die Spalte "editable" - Eigenschaft auf "false").
Schritt #1, machen Sie Ihre grid "editable" - Eigenschaft setzt auf "true"
Schritt #2, machen Sie Ihre grid-Spalte "editable" - Eigenschaft setzt auch auf "true" und "rendererIsEditor" auf "true"
Ist es wichtig, legen Sie die dataField-zu einem falschen Feld, weil da wir den renderer als Redakteur das bedeutet, dass was auch immer Sie aktualisieren in der itemRenderer zugewiesen werden, die dataField-d.h. Sie legen Sie die dataField-zu "Foo", die einen Typ int, und Sie nicht-primitive Objekte füllen einer comboBox-itemRenderer. Wenn Sie eine Auswahl treffen, wird dieses Objekt wird zugeordnet zu "Foo"
Schritt #3, machen Sie Ihre grid-Spalte "Datenfeld" - Eigenschaft setzt auch zu einem falschen Feld.
Nun lassen Sie uns das tun,, die es ermöglichen, Navigation mit der Tabulatortaste zu arbeiten itemRenderer
Weiß ich, dass dies nicht in einer optimierten version, aber dies zu tun für den 1. Durchlauf.
Beispiel dafür, wie es auf Ihren itemRenderer:
Nur dann setzen, dass in der gridColumn-und das ist es.
Genießen.
Grundsätzlich, wenn Sie möchten, entfernen Sie die Standard-Verhalten der Schwerpunkt change-Ereignis. Ich glaube, Sie brauchen, um dies zu tun: