kenichiro246’s blog

主にC#での仕事をしてます。今はAWSに関わり始めました。

Xamarin.Androidで横向きキーボード表示時に画面が隠れないようにする方法

Android端末を横向きにしてキーボードを表示させると、以下のように現在表示されている画面の情報が見えなくなるので、これをXamarin.Androidで解消できるようにします。
Android端末のキーボード設定でも解消できますが、今回はプログラムで制御させてみます。

※キーボードの設定で変更出来ることは@ytabuchiさんから、キーボードの制御が出来ることを@Santea3173さんから教えてもらいました。ありがとうございました。

ゴールは以下の通りCustomEntryにフォーカスが当たった時の挙動になるようにします。
f:id:kenichiro246:20170617174422g:plain:w400

手順

実装する手順は以下のとおりです。実はたったこれだけ。 ポイントとしてはImeActionへの設定値は、ImeFlagsの値をImeActionへキャストしないといけないところ。恥ずかしながら実はここで結構ハマった。

  1. EntryのCustomRendererを作る
  2. 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/

ではまた。