How and why to use Android Visibility Listeners

Android UI はビューで構成されており、通常のアプリケーションでは、通常、複数のビューが存在します。

リスナーが機能するためには、まず、レイアウト階層でビューが見つかることを確認する必要があります。 これが起こる 2 つの方法があります。

  1. View は、XML ファイルで定義されているので、すでにレイアウトの一部です。
  2. View を動的に作成し、addView メソッドを使用してそれを追加する必要があります。

    View の表示状態は、Integer 型で、3 つのオプションのうちの 1 つを持つことができます。

    1. VISIBLE (0) – ビューはユーザーに見えています
    2. INVISIBLE (4) – ビューはユーザーには見えませんが、レイアウト内でスペースを取っています
    3. GONE (8) – ビューは見えなくなりました。 レイアウト階層の内部では、ビューの可視性が変更されたときに、それを知るのに役立つネイティブ オプションがいくつかあります。

      onVisibilityChanged

      このメソッドは、ビューまたはビューの祖先の可視性が変更されたときにトリガーされます。 可視性の状態は、visibility パラメータ内で見つかります。

      onWindowVisibilityChanged

      このメソッドは、ビューの含むウィンドウがその可視性を変更したときにトリガーされます。 これは、View があるウィンドウがユーザーから見えることを保証するものではありません。 TextView とボタンがある LinearLayout を作成します。 ボタンのクリックアクションがカスタムビューをレイアウトに追加するようにします。

      カスタム ビュー:

      そして最後に MainActivity 内でのコードです。

      OnClick Listener をボタンにアタッチします。

      アプリケーションを実行してボタンを押すと、次のようになります:

      Logcat で、ビューが表示されるとリスナーが呼ばれることを確認できます

      サンプル プロジェクトは、ここから取得できます。

      ViewTreeObserver

      これはネイティブ オブジェクトで、ビュー ツリーへのさまざまな可視性の変更を通知する幅広いリスナーを持っています。 注目すべきいくつかの顕著なものは、

      • OnGlobalLayoutListener
      • OnWindowAttachListener
      • OnWindowFocusChangeListener

      ViewTreeObserver を取り付けるために、次のことを行う必要があります。

      removeOnGlobalLayoutListener requires API > 15

      linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) は、リスナーが 1 回だけ呼ばれることを確認するものです。 もし、変更時にリッスンし続けたい場合は、これを削除してください。