Android
 Computer >> コンピューター >  >> システム >> Android

Android 可視性リスナーを使用する方法と理由

Android UI は Views から構築され、通常のアプリケーションには通常いくつかあります。ユーザーが現在どのビューを見ているかを調べるには、Visibility Listeners をインストールする必要があります .

ビューの可視性ステータスを識別するために必要なさまざまなオプションについては、以下をお読みください。

可視化する方法

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

<オール>
  • ビューは XML ファイルで定義されているため、既にレイアウトの一部です
  • View を動的に作成したため、addView メソッドを使用して追加する必要があります
  • public void addView (View child, ViewGroup.LayoutParams params)
    child は追加するビューで、LayoutParams はレイアウト パラメータ (つまり、幅と高さ) です

    ビューの可視性ステータスは整数型で、次の 3 つのオプションのいずれかを持つことができます:

    <オール>
  • 可視 (0) - ビューはユーザーに表示されます
  • 目に見えない (4) - ビューはユーザーには見えませんが、レイアウト内のスペースを占有します
  • GONE (8) - ビューは非表示で、レイアウト内のスペースを占有しません
  • レイアウト階層に入ると、View の可視性が変更されたことを知るのに役立つネイティブ オプションがいくつかあります。

    onVisibilityChanged

    protected void onVisibilityChanged (View changedView, int visibility)

    このメソッドは、ビューまたはビューの祖先の可視性が変更されたときにトリガーされます。可視性のステータスは、可視性パラメータ内にあります。

    onWindowVisibilityChanged

    protected void onWindowVisibilityChanged (int visibility)

    このメソッドは、View を含むウィンドウの可視性が変更されたときにトリガーされます。 別のウィンドウに隠れている可能性があるため、ビューが表示されているウィンドウがユーザーに表示されることを保証するものではありません。

    可視化リスナーの動作

    これら 2 つのリスナーの動作を確認するために、簡単なプロジェクトを作成してみましょう。 TextView とボタンを備えた LinearLayout があります。ボタンのクリック アクションでカスタム ビューをレイアウトに追加します。

    Android 可視性リスナーを使用する方法と理由

    カスタム ビュー:

    package com.tomerpacific.viewvisibility;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import static android.view.Gravity.CENTER;
    
    public class MyCustomView extends LinearLayout {
    
        private final String TAG = MyCustomView.class.getSimpleName();
    
        public MyCustomView(Context context) {
            super(context);
            this.setBackgroundColor(Color.GREEN);
            this.setGravity(CENTER);
            TextView myTextView = new TextView(context);
            myTextView.setText("My Custom View");
            addView(myTextView);
        }
    
        @Override
        public void onVisibilityChanged(View changedView, int visibility) {
            super.onVisibilityChanged(changedView, visibility);
    
            Log.d(TAG, "View " + changedView + " changed visibility to " + visibility);
        }
    
        @Override
        public void onWindowVisibilityChanged(int visibility) {
            super.onWindowVisibilityChanged(visibility);
    
            Log.d(TAG, "Window visibility changed to " + visibility);
        }
    
    }

    そして最後に、MainActivity のコード:

    package com.tomerpacific.viewvisibility;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        private Button addCustomViewBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            addCustomViewBtn = (Button) findViewById(R.id.addCustomViewBtn);
    
            addCustomViewBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
                    MyCustomView myCustomView = new MyCustomView(getApplicationContext());
                    myCustomView.setLayoutParams(new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT, 
                        LinearLayout.LayoutParams.WRAP_CONTENT));
    
                    mainLayout.addView(myCustomView);
                }
            });
        }
    }
    OnClick リスナーをボタンにアタッチします

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

    https://giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5

    サンプル プロジェクトはこちらから入手できます。

    ViewTreeObserver

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

    • OnGlobalLayoutListener
    • OnWindowAttachListener
    • OnWindowFocusChangeListener

    ViewTreeObserver をアタッチするには、次の手順を実行する必要があります:

    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
    
    ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver(); 
    viewTreeObserver.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() { 
        
        @Override 
        public void onGlobalLayout() {
            linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
            //TODO Add Logic
        } 
    });
    removeOnGlobalLayoutListener には API> 15 が必要です

    linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) リスナーが一度だけ呼び出されるようにします。引き続き変更を聞きたい場合は、削除してください。

    コメントや提案がありましたら、お気軽にお知らせください。


    1. Safari でプライベート ブラウジングを使用する理由と方法

      最近のすべての Web ブラウザーと同様に、macOS X の既定の Web ブラウザーである Safari も高度になりました。安全で、同時に複数のタブを処理する準備ができています。しかし、プライベート ブラウジングについて言えば、シークレット ブラウジングに役立つプライベート ブラウジング モードも搭載されています。 Mac の Safari でプライベート ブラウジングを使用する理由は多数あります。この記事は、プライベート ブラウジングとは何か、Mac でプライベート ブラウジングを使用してブラウジング エクスペリエンスを安全かつ機密に保つ方法を知りたいすべての人を対象としています。

    2. 個人用リマインダー アプリの使用方法とその理由

      オーマイゴッド!すっかり忘れてました 物事を忘れ続けるので、私は上記のステートメントを少なくとも 1 日に数回使用します。今、私は自分の脳や健康に何の問題もないことを知っています.この物忘れは、今日の世界が速いペースで動いているためです.やることがたくさんあり、会わなければならない人がたくさんいて、Netflix には見たいシリーズがたくさんあるので、何かを忘れてしまうことでしょう。 忘れて後で実行できるものもありますが、重要なものもあり、見逃すことはお勧めできません。そのような最優先事項の 1 つは時間通りに薬を服用することですが、特に自宅で仕事をしている場合は、オフィスでの会議を含める