.NET MAUI の Entry に ClearButtonVisibility を設定しているのに、TextInputLayout の InputView として組み込むと Android だけ「×」が反応せずテキストが消えない──この現象を、状況整理から最短の回避策、恒久対応の考え方までまとめます。
現象:iOS では消えるのに Android では「×」が効かない
まず、このトラブルは「クリアボタンが表示される/されない」ではなく、表示はされているのにタップしても Entry.Text が空にならない(=何も起きない)という点がポイントです。入力 UX に直結するので、検索ボックスやフォーム入力で特に痛い不具合になります。
| 観点 | iOS | Android | 補足 |
|---|---|---|---|
| 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/Effect | Entry を拡張している処理がないか | タッチ処理の上書きを疑う |
| レイアウト | 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 を使わずに自前のクリアボタンを重ねる方法も有効。

コメント