.NET MAUI EntryのクリアボタンがAndroidで効かない原因と回避策(TextInputLayout/InputView・.NET 9)

.NET MAUI の Entry に ClearButtonVisibility を設定しているのに、TextInputLayout の InputView として組み込むと Android だけ「×」が反応せずテキストが消えない──この現象を、状況整理から最短の回避策、恒久対応の考え方までまとめます。

目次

現象:iOS では消えるのに Android では「×」が効かない

まず、このトラブルは「クリアボタンが表示される/されない」ではなく、表示はされているのにタップしても Entry.Text が空にならない(=何も起きない)という点がポイントです。入力 UX に直結するので、検索ボックスやフォーム入力で特に痛い不具合になります。

観点iOSAndroid補足
TextInputLayout の InputView に Entry(ClearButtonVisibility=WhileEditing)クリアできる「×」を押してもテキストが消えない報告例あり
Entry の ClearButtonVisibility の仕様フォーカス中かつテキストありで「クリアボタン」を表示できるプロパティは公式ドキュメントに記載

前提:TextInputLayout の InputView 構成が「起点」になりやすい理由

TextInputLayout(Material 風のラベル、アウトライン、エラーテキストなどを提供する入力コンテナ)は、内部で入力コントロール(Entry など)をホストして見た目や余白、アニメーションを管理します。ここでレイアウト構造が複雑になり、Android 側でタップ判定(ヒットテスト)のズレや、コンテナ側がタッチを先に拾ってしまう問題が起きると、「×」だけ反応しない状況が発生しやすくなります。

実際、Android の Entry クリアボタンは過去にも「コンテナに入れる」「Grid や WidthRequest を絡める」「Margin/余白をいじる」などの条件で、タップ位置がずれる/押せないタイプの不具合が複数報告されています。TextInputLayout はまさにそれらの条件を内包しやすい、というわけです。

再現確認:まずチェックしたいポイント

「本当にクリアボタンのクリックが効いていないのか」「別要因(バインディングやスタイル)で Text が復元されていないか」を切り分けると、無駄な遠回りを減らせます。

チェック項目見るポイント意図
ClearButtonVisibility の値WhileEditing になっているかそもそも表示条件が満たされているかを確認
バインディングText が TwoWay か、VM 側で即座に再代入していないか「消えた直後に戻る」ケースの除外
スタイル/Behavior/EffectEntry を拡張している処理がないかタッチ処理の上書きを疑う
レイアウトTextInputLayout 内の余白、Margin、WidthRequest、Grid などタップ領域ズレの温床を洗う
端末/OS実機とエミュレータ、Android 14/15 などで差があるか特定 API レベル依存の可能性を探る

最小再現のイメージ(XAML)

TextInputLayout の種類(CommunityToolkit 版、Syncfusion 版など)でタグ名は変わりますが、問題の構造は「InputView(または Content)に Entry を入れる」が共通です。

<!-- TextInputLayout は利用ライブラリに合わせて置き換えてください -->
<TextInputLayout Hint="検索">
  <TextInputLayout.InputView>
    <Entry ClearButtonVisibility="WhileEditing"
           Placeholder="キーワード" />
  </TextInputLayout.InputView>
</TextInputLayout>

この状態で iOS は「×」で消えるのに、Android では消えない、という報告が出ています。

原因の整理:.NET 9 側の不具合(回帰の可能性)+Android のタップ領域ズレ

Microsoft Q&A の回答では、同様の状況について「.NET 9 で再現するが .NET 8 では動作する」旨が言及され、MAUI の GitHub リポジトリに報告することが推奨されています。つまり「アプリ側の書き方ミス」というより、フレームワーク側の不具合として扱うのが妥当、という整理です。

一方で、Android の Entry クリアボタンは以前から「レイアウト条件で押せない」系の不具合が繰り返し報告されており、Margin などの余白が絡むと挙動が壊れる問題に対して修正 PR が入った例もあります。今回の TextInputLayout でも、内部の余白・計測・配置が絡んで、結果として「×」の表示位置とタップ判定位置が一致しない(あるいは親が吸う)状態になっている可能性が高いです。

重要:原因を断定するよりも、まずは「確実に直る回避策」「修正バージョンへ追随する方針」を押さえた方が、実務では安全です。次の章からは、そのための手順を具体的にまとめます。

最短の回避策:Entry を VerticalStackLayout(Padding=0)で包む

いちばん手軽で効果が期待できる回避策が、Entry を Padding=0 の VerticalStackLayout で包む方法です。Microsoft Q&A の回答でも、この方法で Android でも通常どおり動作すると案内されています。

<VerticalStackLayout Padding="0">
  <Entry ClearButtonVisibility="WhileEditing" />
</VerticalStackLayout>

TextInputLayout の InputView に入れる場合(実用形)

TextInputLayout の中に配置する場合は、次のように「InputView の直下をレイアウトで包む」形にします。

<TextInputLayout Hint="検索">
  <TextInputLayout.InputView>
    <VerticalStackLayout Padding="0">
      <Entry ClearButtonVisibility="WhileEditing"
             Placeholder="キーワード" />
    </VerticalStackLayout>
  </TextInputLayout.InputView>
</TextInputLayout>

なぜ「Padding=0」が効きやすいのか(実務目線の解釈)

この回避策が効く理由は、完全に 1 つに断定するのは難しいものの、過去の不具合傾向から見ると次の説明がしっくりきます。

  • Android の Entry クリアボタンは「表示位置」と「タップ判定位置」がズレると、見えている「×」を押してもイベントが当たらない。
  • ズレは Margin / WidthRequest / Grid / Frame / 余白など、計測・配置に影響する条件で発生しやすい。
  • VerticalStackLayout を 1 枚挟むことで、TextInputLayout が直接 Entry を扱うよりも、計測・配置の計算が安定し、結果としてタップ領域のズレが解消されることがある。

なお、ここで Padding を付けると再びズレのきっかけになる可能性があるため、まずは Padding=0 を守り、余白を付けたい場合は外側(TextInputLayout 側や親レイアウト側)で調整するのがおすすめです。

推奨対応:直近の運用を守りつつ、恒久対応に繋げる

対応方針の優先順位

優先方針向いているケースメリット注意点
高VerticalStackLayout(Padding=0) で回避すぐ直したい/UI 変更を最小にしたい差分が小さい、影響範囲が限定的将来の修正で不要になる可能性はある
中.NET / MAUI の修正バージョンへ更新ワークアラウンドを減らしたい根本解決に寄せられる他の破壊的変更・新不具合の検証が必要
中.NET 8 を使う(影響回避)安定優先、リリース直前既知の安定構成に寄せやすい新機能が必要な場合は難しい
低独自クリアボタンを実装(後述)UI/UX を自分で完全制御したいフレームワーク依存を下げられる実装・保守コストが上がる

「.NET 9 の不具合」の扱い:GitHub に報告する価値が高い

今回のように「特定の構成(TextInputLayout の InputView)でのみ起きる」「iOS は正常で Android だけ壊れる」「バージョン差で挙動が変わる」問題は、開発者側で抱え込むよりも、フレームワーク側に再現手順を揃えて報告することで解決スピードが上がりやすいです。Microsoft Q&A でも MAUI リポジトリへの報告が推奨されています。

補足:Android の「余白/マージン絡み」の修正が入った例もある

Entry のクリアボタンが Android で効かない問題は、過去にMargin に起因する不具合として扱われ、修正 PR が取り込まれた例があります。該当の GitHub issue には「fixed-in-9.0.21」のラベルが付いているため、利用している MAUI/Workload のパッチレベル次第では既に解消されている可能性もあります。

とはいえ、TextInputLayout のような「さらにレイアウトが複雑になるホスト」を介すると別経路で再発することもあるため、更新で直るか/回避策がまだ必要かは、必ず実機で確認してください。

バグ報告のコツ:再現性の高い情報を揃える

dotnet/maui に報告する際は「再現プロジェクト」「環境情報」「期待結果/実結果」を揃えるのが最短ルートです。特に今回のような UI タップ不具合は、余白やレイアウトが原因になりやすいので、UI ツリーが分かる形が効果的です。

項目書く内容(例)狙い
タイトル[Android] Entry ClearButtonVisibility does not clear when hosted in TextInputLayout InputView検索性と分類のしやすさ
再現手順新規 MAUI プロジェクト → TextInputLayout に Entry を InputView として配置 → WhileEditing → Android で×が無反応再現の速さ
期待結果×タップで Text が空になる仕様の明確化
実結果×が表示されるが Text が消えない症状の明確化
環境情報dotnet –info、MAUI workload、VS バージョン、Android API、実機/エミュ、TextInputLayout のライブラリ名とバージョン原因特定に必要
ワークアラウンドVerticalStackLayout(Padding=0) で改善する回避条件が手掛かりになる

ワークアラウンドが効かないときの追加チェック

VerticalStackLayout で包んでも改善しない場合、次の「やりがち」ポイントを確認してください。特に Material 系の入力コンテナは、見た目のために内部余白やオーバーレイを持っていることが多く、ここがタップ判定に影響します。

  • TextInputLayout 側で右側にオーバーレイが載っていないか(サフィックス/アイコン/ボタンなど)。
  • 負の Marginや、WidthRequest を固定していないか(タップ領域ズレの原因になりやすい)。
  • Entry をさらに Frame / Border / Grid などで多重に包んでいないか(ヒットテストが複雑化)。
  • Entry の上に透明な要素(GestureRecognizer 付き)を重ねていないか。
  • TextChanged で Text を整形していて、クリア直後に元の値を再代入していないか(入力補正処理がある場合に起きがち)。

どうしても安定させたい場合:独自の「クリアボタン」を実装する

フレームワークのクリアボタンに依存しない方法として、ClearButtonVisibility を無効化して、自前のボタン(または ImageButton)を Entry の右側に重ねる実装があります。Microsoft Q&A でも、確認ダイアログを挟みたいケース向けにこの手法が紹介されていますが、今回のように「×が反応しない」問題の回避にも流用できます。

例:Grid で Entry とクリアボタンを重ねる(XAML)

<Grid>
  <Entry x:Name="MyEntry"
         ClearButtonVisibility="Never"
         Placeholder="キーワード"
         TextChanged="MyEntry_TextChanged" />



例:コードビハインド(C#)

private void MyEntry_TextChanged(object sender, TextChangedEventArgs e)
{
    // 空なら消す、文字があれば出す
    ClearButton.IsVisible = !string.IsNullOrEmpty(e.NewTextValue);
}

private void ClearButton_Clicked(object sender, EventArgs e)
{
MyEntry.Text = string.Empty;
ClearButton.IsVisible = false;
}

この方式だと、タップ処理が Entry 内蔵のクリア機構に依存しないため、レイアウト起因の「×が反応しない」問題を回避しやすいのが利点です。一方で、プラットフォームごとの見た目(アイコン、サイズ、アクセシビリティ)を整える必要があるため、プロダクトの要求に応じて選択してください。

まとめ:結局どうするのが最適か

  • TextInputLayout の InputView に Entry を入れたとき、Android で ClearButtonVisibility の「×」が反応しないケースがある。
  • 報告例では、.NET 9 で再現し .NET 8 では動作する旨が言及され、MAUI リポジトリへの報告が推奨されている。
  • 最短の回避策は、Entry を VerticalStackLayout(Padding=0)で包むこと。
  • 根本解決は、修正を取り込んだ MAUI/Workload へ追随すること。クリアボタンは過去にも Margin/レイアウト絡みの修正が入っている。
  • どうしても安定させたいなら、ClearButtonVisibility を使わずに自前のクリアボタンを重ねる方法も有効。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次