7月 132012
 
Pocket

環境:Flex2.0.1(どうやらFlex3.0でも変わってなさそう?)

このメモ以降にも色々調べたりAdobeとやりとりしたはずだが、よく覚えてない…
FlashPlayer10との絡みもあったはず。

FlexのTextInputはimeModeプロパティを指定した時変な動きをする。

以下のように入力項目が並んでいるとする。

  • 入力①:IME制御なし
  • 入力②:ひらがな
  • 入力③:IME制御なし

①にフォーカスがある状態で、IMEがONかつひらがな入力の場合、
①→②→③とフォーカスを移動すると③の時点でIMEがOFFになってしまう。
ちなみにIMEはOFFにされるが、変換モード(全角カタカナ、半角英数など)は①の状態を記憶しておき、③に移る時に元に戻している。

③では、②で変更されたモードをそのまま引き継ぐのが通常の動作のように感じる。
個人的には①のモードを記憶しておいて、戻ってくれたほうが使い勝手がいいと思うのだけど。。

[js title=”mx.controls.TextInput.asから抜粋” mark=”70,71″]
//フォーカスINハンドラ
override protected function focusInHandler(event:FocusEvent):void
{
//このへんはフォーカス制御
if (event.target == this)
systemManager.stage.focus = textField;

var fm:IFocusManager = focusManager;

if (editable && fm)
{
fm.showFocusIndicator = true;
if (textField.selectable &&
_selectionBeginIndex == _selectionEndIndex)
{
textField.setSelection(0, textField.length);
}
}

//継承元呼び出し
super.focusInHandler(event);

//IMEモード制御ここから
if (_imeMode != null && _editable)
{
//IMEモードを制御する場合if内通る。
IME.enabled = true; //IMEをON
prevMode = IME.conversionMode; //変換モードを記憶
// When IME.conversionMode is unknown it cannot be
// set to anything other than unknown(English)
try
{
if (!errorCaught &&
IME.conversionMode != IMEConversionMode.UNKNOWN)
{
IME.conversionMode = _imeMode;
}
errorCaught = false;
}
catch(e:Error)
{
// Once an error is thrown, focusIn is called
// again after the Alert is closed, throw error
// only the first time.
errorCaught = true;
throw new Error(
StringUtil.substitute(resourceUnsupportedMode, _imeMode));
}
}
}

//フォーカスOUTハンドラ
override protected function focusOutHandler(event:FocusEvent):void
{
//継承元呼び出し
super.focusOutHandler(event);

IMEモード制御ここから
if (_imeMode != null && _editable)
{
//IMEモードを制御する場合if内通る。

// When IME.conversionMode is unknown it cannot be
// set to anything other than unknown(English)
// and when known it cannot be set to unknown
if (IME.conversionMode != IMEConversionMode.UNKNOWN
&& prevMode != IMEConversionMode.UNKNOWN)
//変換モードがUNKNOWNじゃなかったら前のモードに戻す
IME.conversionMode = prevMode;
//★IMEを強制的にOFFにしてる!★
IME.enabled = false;
}

dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
}
[/js]

 Leave a Reply