2016-03-30 76 views
1

我希望能夠知道用戶何時可以實際看到我的小部件/片段中的內容(而不是僅僅知道小部件呈現在摺疊下方或緩存片段中,但可能永遠不會實際顯示) 。在Android上,如何判斷屏幕上顯示元素的時間?

我搜索了某種鉤子的高和低,讓你知道什麼時候顯示到屏幕上,但找不到一個。這樣的事情是否存在,或者這是Android忽視的東西?是否有可能以某種方式修補它,或者我只是運氣不好?

謝謝!

+0

從那個widget/fragment中使用Toast怎麼樣? – learner

+0

您是否在查看佈局中的單個「視圖」對用戶是否可見?如果是這樣,這個答案可能會幫助你:http://stackoverflow.com/a/12428208/3962091 – NoChinDeluxe

+0

@NoChinDeluxe,它的問題是它告訴你*如果*視圖是可見的,但不*當*它變得可見。我們是否必須經常檢查以確定它何時發生? Android不應該有這樣的事件嗎? – TOB

回答

0

Activity類的文檔:

一個活動的整個壽命通過向的onDestroy單個最終呼叫第一次調用的onCreate(束)之間發生()。一個活動將在onCreate()中完成「全局」狀態的所有設置,並釋放onDestroy()中的所有剩餘資源。例如,如果它有一個在後臺運行的線程從網絡下載數據,它可能會在onCreate()中創建該線程,然後停止onDestroy()中的線程。

活動的可見生命週期發生在對onStart()的調用之間,直到對onStop()的相應調用。在此期間,用戶可以在屏幕上看到活動,但它可能不在前臺並與用戶進行交互。在這兩種方法之間,您可以維護向用戶顯示活動所需的資源。例如,您可以在onStart()中註冊BroadcastReceiver,以監視影響UI的更改,並在用戶不再看到您顯示的內容時,在onStop()中取消註冊。可以多次調用onStart()和onStop()方法,因爲活動對用戶可見並隱藏。

活動的前臺生命期發生在對onResume()的調用之間,直到對onPause()的相應調用。在此期間,活動在所有其他活動之前,並與用戶進行交互。一個活動可以頻繁地在恢復狀態和暫停狀態之間進行 - 例如,當設備進入睡眠狀態,活動結果被傳遞時,當新的意圖被傳遞時 - 所以這些方法中的代碼應該相當輕量級。

第二和第三點似乎清楚地提到了你要找的東西(onResume()方法)。如果您使用的是碎片,則適用相同的規則。該片段的onResume()方法將在該活動的onResume()之後調用。

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

編輯:
那麼,顯然沒有直接解決這個。我有一個想法,但它更像是一種即興而非適當的解決方案。此外,它可能會或可能不會工作。如果你在使用ViewPager片段(含標籤),該FragmentPagerAdapter將調用當前顯示的片段setUserVisibilityHint(true)

  1. - 嘗試這些東西。你可以在你的片段中檢查getUserVisibilityHint()
  2. 如果您將ScrollView用作容器,也許您可​​以偵聽滾動更改並確定您的片段是否可見或滾動出來。有關更多信息,請參閱this answer
  3. 對於單個小部件,您可以使用View.isVisible()檢查可見性。

這些選項都不提供明確的基於事件的機制來檢查可見性,但也許可以以某種方式使用它們。一種方法是定義自己的回調,並重寫上述方法來調用它們。讓我知道如果你有任何這些方法(或其他方法)工作。

+0

這只是說當片段在前景中。它仍然可能不在可見屏幕上,但可能低於摺疊。在某些(大型)設備上,它可能對用戶可見。在其他人可能不會。 – TOB

+0

@TOB當你調用onStart()時,你會說什麼。當調用onResume()時,活動「在所有其他活動之前並與用戶交互」。這確實意味着它的內容對用戶是可見的。閱讀我再次引用的文檔。 – Rohan

+0

不能有兩個片段在另一個之上,其中較低的片段離開屏幕,但可通過滾動到達?如果沒有,我真的在問小部件。 – TOB