Entryで矢印キーを押すとタブが切り替わってしまう
2019年12月23日
Xamarin.FormsのAndroid版で発生。
タブで隣同士の画面
最高血圧の入力用Entryは、
1 |
<Entry Grid.Column="1" Grid.Row="2" Keyboard="Numeric" Text="{Binding Max.Value}" Style="{StaticResource entryStyle1}"/> |
Keyboard=”Numeric”にしてると
と、入力パットは数値用が出るんだが、GalaxyなのでキーボードをGalaxy日本語キーボードに変えると、
矢印キーが出現する。
テキストを入力中はテキスト位置を移動できるんだけど、行頭・行末ではTabbedPageに矢印キーが転送され?タブが変わってしまう。(´・ω・`)
そして次のタブの先頭のコントロールにフォーカスが当たり、次のタブの先頭コントロールがDatePickerのためカレンダーが出てしまうという。(|| ゚Д゚)ガーン!!
まるで数値入力用に表示されたみたいな。
そこで、行頭・行末にカーソルがあるときは、矢印キーをキャンセルするようにした。
もともと下線を消すRendererを作ってあったので、これにEditTextのイベントでキーを判定して無視するようにした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))] namespace MyApp.Droid.Renderer { class MyEntryRenderer : EntryRenderer { public MyEntryRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (e.NewElement == null || e.OldElement != null) return; if (Control != null) { Control.SetPadding(5,0,5,0); Control.SetBackground(null); var nativeEditText = (global::Android.Widget.EditText)Control; nativeEditText.KeyPress += NativeEditText_KeyPress; } } private void NativeEditText_KeyPress(object sender, KeyEventArgs e) { if (e.KeyCode == Keycode.DpadLeft && Control.SelectionStart == 0 || e.KeyCode == Keycode.DpadRight && Control.SelectionEnd == Control.Length()) { e.Handled = true; return; } e.Handled = false; } protected override void Dispose(bool disposing) { if (Control != null) { var nativeEditText = (global::Android.Widget.EditText)Control; nativeEditText.KeyPress -= NativeEditText_KeyPress; } base.Dispose(disposing); } } } |
キーコードは、Keycode.DpadLeftとKeycode.DpadRightらしいのでSelectionStartとSelectionEnd で判定した。
ネイティブ側の理解は大事だなぁ。
Tips出てきて良かった。ε-(´∀`*)ホッ
—
(参考サイト)