Android 可視性リスナーを使用する方法と理由
Android UI は Views から構築され、通常のアプリケーションには通常いくつかあります。ユーザーが現在どのビューを見ているかを調べるには、Visibility Listeners をインストールする必要があります .
ビューの可視性ステータスを識別するために必要なさまざまなオプションについては、以下をお読みください。
可視化する方法
リスナーが機能するためには、まず View がレイアウト階層にあることを確認する必要があります。これには 2 つの方法があります:
<オール>public void addView (View child, ViewGroup.LayoutParams params)
ビューの可視性ステータスは整数型で、次の 3 つのオプションのいずれかを持つことができます:
<オール>レイアウト階層に入ると、View の可視性が変更されたことを知るのに役立つネイティブ オプションがいくつかあります。
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
このメソッドは、ビューまたはビューの祖先の可視性が変更されたときにトリガーされます。可視性のステータスは、可視性パラメータ内にあります。
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
このメソッドは、View を含むウィンドウの可視性が変更されたときにトリガーされます。 別のウィンドウに隠れている可能性があるため、ビューが表示されているウィンドウがユーザーに表示されることを保証するものではありません。
可視化リスナーの動作
これら 2 つのリスナーの動作を確認するために、簡単なプロジェクトを作成してみましょう。 TextView とボタンを備えた LinearLayout があります。ボタンのクリック アクションでカスタム ビューをレイアウトに追加します。
カスタム ビュー:
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);
}
});
}
}
アプリケーションを実行してボタンを押すと、次のようになります。
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
}
});
行 linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)
リスナーが一度だけ呼び出されるようにします。引き続き変更を聞きたい場合は、削除してください。
コメントや提案がありましたら、お気軽にお知らせください。
-
Safari でプライベート ブラウジングを使用する理由と方法
最近のすべての Web ブラウザーと同様に、macOS X の既定の Web ブラウザーである Safari も高度になりました。安全で、同時に複数のタブを処理する準備ができています。しかし、プライベート ブラウジングについて言えば、シークレット ブラウジングに役立つプライベート ブラウジング モードも搭載されています。 Mac の Safari でプライベート ブラウジングを使用する理由は多数あります。この記事は、プライベート ブラウジングとは何か、Mac でプライベート ブラウジングを使用してブラウジング エクスペリエンスを安全かつ機密に保つ方法を知りたいすべての人を対象としています。
-
個人用リマインダー アプリの使用方法とその理由
オーマイゴッド!すっかり忘れてました 物事を忘れ続けるので、私は上記のステートメントを少なくとも 1 日に数回使用します。今、私は自分の脳や健康に何の問題もないことを知っています.この物忘れは、今日の世界が速いペースで動いているためです.やることがたくさんあり、会わなければならない人がたくさんいて、Netflix には見たいシリーズがたくさんあるので、何かを忘れてしまうことでしょう。 忘れて後で実行できるものもありますが、重要なものもあり、見逃すことはお勧めできません。そのような最優先事項の 1 つは時間通りに薬を服用することですが、特に自宅で仕事をしている場合は、オフィスでの会議を含める