文字入力時、それ以外のViewにフィルターをかける【Android】

こんにちは。てちこまです。

アプリを作成しているとユーザに特定の操作以外させたくない場面があると思います。

例えば、重要な入力やチュートリアル。同意画面などです。

今回はSearchView(EditText)と他のコンポーネントが同時に存在する画面で入力時に他の操作が出来ないようにフィルターをかけます。

目的

  • 誤タップの防止
  • 入力中であることを視覚的に見せる

完成画像

実装内容

今回はとにかく一番楽だろうとFrameLayoutでレイアウトの重ね合わせで実装しました。

最上層

中間層
真っ黒で全画面に引き伸ばした半透明のView(Filter)

最下層

中間のFilterを通常時は非表示にしてSearchViewにFocusが当たった時のみ表示することで完成画像のようなそれっぽい動きさせてます。

XML

※長いので一部省略しています。

FrameLayoutは書いたパーツが下から上に積み上がっていきます。またフィルターの半透明色の指定はこちらのQiita記事を参考に行ってください。今回は#7F000000を使用しています。

コード

※一部抜粋

今回はSearchViewにフォーカスが当たるとフィルターをフェードインし、フォーカスが外れるかフィルターをタップ(フィルタータップ時フォーカスが外れるようにしている)することでフィルターがフェードアウトするようにしています。

ここでの最重要ポイントはフィルターが消える際にisClickableをfalseにすることでフィルターのクリックリスナーを解除している点です。

これをしないとフィルターが解除されてからリスト、今回で言うところの「現在地を出発地とする」などをタップ出来なくなります。

ViewをremoveViewで消すことでも同じことが出来ますが再度表示する時にviewを再生成する手間がかかるのでこちらがベストかと思います。

まとめ

isClickableあたりの検証で1時間ほどかけてしまいました...
ゴリ押し感もありますがとりあえずこれで満足しています。
一応自力でフィルターつけたい時はこれでなんとかなるかな~。

参考記事
Viewに付与したOnClickListenerを解除する方法

てちこま

高卒後3年ニート なんとなくPC好きだったのでコン専入学 2020から新米WEBエンジニアになりました

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする