2016-03-30 4 views
1

私のウィジェット/フラグメントのコンテンツをユーザーが実際に見ることができるようにしたいのですが(ウィジェットがフォールドの下に表示されているか、キャッシュされているが実際には表示されないかもしれないということを知っているだけです) 。Androidの場合、要素が画面にいつ表示されるかをどのように確認できますか?

何かが画面に表示されたときに知ることができるが、見つからないフックがあるかどうか検索しました。そのようなものが存在するのか、それともAndroidが見落としたものなのでしょうか?これを何らかの方法で一緒にパッチすることは可能ですか、それとも私は幸運なのでしょうか?

ありがとうございます!

+0

そのウィジェット/フラグメントからトーストを使用することはどうですか? – learner

+0

あなたのレイアウトの個々の 'View'がユーザに見えるかどうか調べたいですか?もしそうなら、この答えはあなたを助けるかもしれません:http://stackoverflow.com/a/12428208/3962091 – NoChinDeluxe

+0

@NoChinDeluxe、それは問題が表示されるかどうか*表示されますが、 。いつ起きているのかを常にチェックする必要がありますか? Androidにはこのためのイベントはありませんか? – TOB

答えて

0

Activityクラスのドキュメントから:)

活性の全体の寿命がonDestroy(単一最後の呼び出しに至るまでのonCreate(バンドル)への最初の呼び出しの間に起こります。アクティビティはonCreate()で "グローバル"状態のすべての設定を行い、残りのすべてのリソースをonDestroy()で解放します。たとえば、ネットワークからデータをダウンロードするスレッドがバックグラウンドで実行されている場合、onCreate()でそのスレッドを作成してから、onDestroy()でスレッドを停止することがあります。

アクティビティの可視的な有効期間は、onStart()の呼び出しとonStop()への対応する呼び出しの間に発生します。この間、ユーザは画面上のアクティビティを見ることができますが、フォアグラウンドには存在せず、ユーザと対話することもできます。これらの2つの方法の間で、ユーザーにアクティビティを表示するのに必要なリソースを維持できます。たとえば、OnStart()にBroadcastReceiverを登録して、UIに影響を与える変更を監視し、ユーザーが表示しているものが表示されなくなったときにonStop()で登録を解除できます。 onStart()メソッドとonStop()メソッドは、アクティビティが表示されてユーザーに表示されなくなるため、複数回呼び出すことができます。

アクティビティのフォアグラウンド・ライフタイムは、onPause()を呼び出すまで、onResume()の呼び出しの間に発生します。この間、アクティビティは他のすべてのアクティビティの前にあり、ユーザと対話します。たとえば、デバイスがスリープ状態になったとき、アクティビティ結果が配信されたとき、新しいインテントが配信されたときなど、アクティビティは頻繁に再開と一時停止の状態になることがあるため、これらのメソッドのコードはかなり軽量でなければなりません。

2番目と3番目の点には、探しているものが明確に示されているようです(onResume()メソッド)。フラグメントを使用している場合、同じ規則が適用されます。フラグメントのonResume()メソッドは、アクティビティのonResume()の後に呼び出されます。

http://developer.android.com/reference/android/app/Activity.html http://developer.android.com/reference/android/app/Fragment.html#Lifecycle

EDIT:
さて、どうやらこれには直接的な解決策はありません。アイデアはありますが、それは適切な解決策よりも即興のほうがはるかです。また、動作している場合と動作しない場合があります。これらの事を試してみてください - あなたは(タブ付き)ViewPagerに断片を使用している場合

  1. FragmentPagerAdapterは、現在表示されているフラグメントにsetUserVisibilityHint(true)を呼び出します。これはあなたの断片にgetUserVisibilityHint()で確認できます。
  2. ScrollViewをコンテナとして使用している場合は、スクロールの変更をリッスンして、フラグメントが表示されているかスクロールアウトされているかを判断できます。詳細はthis answerを参照してください。
  3. 個々のウィジェットについては、表示可能性をView.isVisible()で確認できます。

これらのオプションのいずれも、可視性をチェックするための明確なイベントベースのメカニズムを提供していませんが、多分それらを何らかの形で使用できます。 1つの方法は、独自のコールバックを定義し、上記のメソッドをオーバーライドしてコールバックすることです。これらの方法(または他の方法)のいずれかが機能するかどうかを教えてください。

+0

これは、フラグメントがフォアグラウンドにある場合にのみ表示されます。それでも表示画面には表示されませんが、折りたたみの下に表示される可能性があります。一部の(大規模な)デバイスでは、ユーザーに表示されることがあります。他の人にはそうではないかもしれません。 – TOB

+0

@TOBあなたが言っていることは、 'onStart()'が呼び出されたときです。 'onResume()'が呼び出されると、そのアクティビティは「他のすべてのアクティビティの前にあり、ユーザと対話しています」。それは、コンテンツがユーザーに見えることを意味します。私が再び引用した文書を読んでください。 – Rohan

+0

2つのフラグメントを上下に重ねて表示することはできません。下のものは画面外にありますが、スクロールでは届きませんか?もしそうでなければ、私は本当にウィジェットを求めています。 – TOB

関連する問題