Xamarin.Androidで横向きキーボード表示時に画面が隠れないようにする方法
Android端末を横向きにしてキーボードを表示させると、以下のように現在表示されている画面の情報が見えなくなるので、これをXamarin.Androidで解消できるようにします。
Android端末のキーボード設定でも解消できますが、今回はプログラムで制御させてみます。
※キーボードの設定で変更出来ることは@ytabuchiさんから、キーボードの制御が出来ることを@Santea3173さんから教えてもらいました。ありがとうございました。
https://t.co/a96I9bcqW6 キーボード側の設定なので、アプリからは制御できないと思われます。
— 田淵 義人@エクセルソフト (@ytabuchi) 2017年6月15日
古い記事ですが、これで実現できるかも…?https://t.co/Jm7CQIwaQj
— Daiki Kawanuma (@Santea3173) 2017年6月15日
ゴールは以下の通りCustomEntryにフォーカスが当たった時の挙動になるようにします。
手順
実装する手順は以下のとおりです。実はたったこれだけ。 ポイントとしてはImeActionへの設定値は、ImeFlagsの値をImeActionへキャストしないといけないところ。恥ずかしながら実はここで結構ハマった。
- EntryのCustomRendererを作る
- EntryのImeActionプロパティを変更する
書いてみよう
では、上記手順のとおり書いてみましょう!
まずはEntryを継承したCustomRenderer用のクラスを準備します。
CustomEntry.cs
namespace KeyboardImeAction { public class CustomEntry : Entry { } }
次にAndroid側のプロジェクトにEntryRendererを継承したクラスを準備します。
CustomEntryDroid.cs
using Android.Views.InputMethods; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; [assembly: ExportRenderer(typeof(KeyboardImeAction.CustomEntry), typeof(KeyboardImeAction.Droid.CustomEntryDroid))] namespace KeyboardImeAction.Droid { class CustomEntryDroid : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(e); if (Control != null) { Control.ImeOptions = (ImeAction)ImeFlags.NoFullscreen; } } } }
最後に作成したCustomEntryをContentPageに配置します。
Entryの動きを確認するため、通常のEntryとCustomEntryを配置してみます。
App.cs
public App() { MainPage = new ContentPage { Content = new StackLayout { Children = { new Label { Text = "Welcome to Xamarin Forms !" }, new Entry { Placeholder = "Entry" }, new CustomEntry { Placeholder = "CustomEntry" } } } }; }
これで実行してみましょう。
Entryにフォーカスが当たった状態と、CustomEntryにフォーカスが当たった状態の違いが見れるかと思います。
尚、ImeFlagsはNoFullscreenを指定しており、NoExtractUiでも同じような挙動をしますが、リファレンスを読んでもイマイチよくわかっていないので、後日もう少し検証してみようかと思います。
GitHubにも上げているので良ければ参考にしてください。
https://github.com/kenichiro246/KeyboardImeAction
参考サイト:
http://android.ohwada.jp/archives/4382
https://xamarinhelp.com/accommodate-on-screen-keyboard-xamarin-forms/
ではまた。