66

我有一個ViewPager,每個頁面是一個片段視圖。我想測試一個片段是否在可見區域。所述Fragment.isVisible僅如何測試片段視圖對用戶是否可見?

  • 的片段連接到一個活動
  • 的片段被設置爲可見
  • 該片段已被添加到一個視圖

的ViewPager將創建3測試(默認)片段,並且它們全部三個都滿足上述標準,但實際上只有一個對用戶可見(人眼

+0

請發佈您的代碼以獲得更好的幫助。 – Raj 2012-02-17 05:34:55

+2

我當然也很想知道這一點。 – 2012-03-07 22:24:59

回答

21

你是對的有一個更好的方法來做到這一點!

看看FragmentPagerAdapter javadoc在線,你會發現有一個方法setPrimaryItem(ViewGroup container, int position, Object object):void正是你所需要的。

根據JavaDoc

公共無效setPrimaryItem(ViewGroup中的容器中,INT的位置,對象的對象)

調用,通知其項當前被認爲 適配器是 「主」 ,這是向用戶顯示的當前 頁面。

參數容器包含視圖,將從中刪除該頁面,其中將刪除該頁面 。位置現在是主要的頁面位置。 object由instantiateItem返回的相同對象(查看, int)。如果實現這一點,並開始調試,以獲得準確時,這個叫你很快就會發現,這是多次觸發,在準備好片段和同時的感覺上滾動狀態

注意現在

用戶正在滑動。

因此,附加ViewPager.OnPageChangeListener可能是一個好主意,只有當頁面瀏覽器滾動狀態再次變爲SCOLL_STATE_IDLE時才做。

+1

如果擴展'Application'類並且必須測試某個特定的UI是否顯示,那麼這種方法很好用。我剛剛結束了使用幾個布爾值來測試應用程序是否背景,以及是否顯示特定片段。 – 2014-05-04 06:58:28

2

如果您知道每個片段附加到您的「頁面」上,可以使用ViewPager.getCurrentItem()來確定哪個片段「可見」。

+4

這就是我現在正在做的。我只是在想如果還有其他方法。謝謝 – davidshen84 2012-02-18 11:18:07

+0

你有沒有找到其他方法? – 2012-03-19 08:26:01

62

這是我用來確定片段的可見性。

private static boolean m_iAmVisible; 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    m_iAmVisible = isVisibleToUser; 

    if (m_iAmVisible) { 
     Log.d(localTAG, "this fragment is now visible"); 
    } else { 
     Log.d(localTAG, "this fragment is now invisible"); 
    } 
} 
+0

這不符合文檔:「設置提示系統有關此片段的用戶界面當前是否可見,此提示默認爲true,並在片段實例狀態保存並恢復持久」 – Edison 2013-05-23 15:38:00

+1

好的解決方案(+1 ),但代碼可以簡化爲: \t'公共無效setUserVisibleHint(布爾isVisibleToUser){ \t super.setUserVisibleHint(isVisibleToUser); \t m_iAmVisible = false; //默認爲不可見 \t if(isVisibleToUser){ \t m_iAmVisible = true; \t} \t}' – PeteH 2013-05-26 06:04:28

+2

簡化爲:公共無效setUserVisibleHint(布爾isVisibleToUser){super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = isVisibleToUser;} – Kasas 2013-07-10 14:45:40

9

出於我的目的,它使用ViewPager.OnPageChangeListener.onPageSelected()Fragment.onActivityCreated()一起執行碎片可見時的操作。 Fragment.getUserVisibleHint()也有幫助。

2

我正在使用「setMenuVisibility」 - 解決此問題的方法。由於每個片段都可以具有操作欄項目,因此您可以確定哪些片段當前對用戶可見。

@Override 
public void setMenuVisibility(final boolean visible) { 
    super.setMenuVisibility(visible); 
    if (!visible) { 
     //not visible anymore 
    }else{ 
     yay visible to the user 
    } 
} 
4

使用getView().isShown()找出碎片是否真的可見?有什麼問題?

+0

你測試了你的想法嗎?我認爲[this](http://stackoverflow.com/questions/6796299/view-getvisibility-isshown-return-incorrect-visibility)帖子指出了同樣的想法。 – davidshen84 2015-04-16 00:01:36

+0

是的。它適用於我,正如鏈接文章中所建議的。 – awy 2015-04-17 06:12:32

+0

顯然,我們在這裏不是說同樣的*知名度*問題... – davidshen84 2015-04-17 13:57:13

3
isVisible() 

即使片段位於活動後面,仍然可以返回true。

我使用了以下內容:

if (getView() != null && getView().isShown()) { 
//your code here 
} 
0

在我的情況IA要做的第一分段一些工作的時候,這個片段給用戶

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 


    if(viewPager.getAdapter() instanceof YourPager) 
    { 
     Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method 
     if(fragemnt instanceof YourFragment) 
     { 
      ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible(); 
     } 
    } 
} 
0

setUserVisibleHint大概可能不可見被調用時,onHiddenChanged可能不會在每次關閉另一個片段時被調用。因此,您可能依賴於onResume(和),但通常會過於頻繁地調用它(例如,打開設備屏幕時)。同樣在某些情況下,它不會被調用,您應該管理主機活動中的當前片段並寫入:

if (currentFragment != null) { 
    currentFragment.onResume(); 
} 
相關問題