24

我有一次加載三頁的ViewPager。如果我從頁面1滑動到頁面2然後滑動到3,則第一頁(片段)將轉到onPause()。然後,如果我滑動到第二頁,即使頁面1對用戶仍不可見,第一頁也會顯示onResume()。所以,我的問題是:如何區分代碼中的第一個和第二個頁面?例如,如果我必須在片段可見時運行一段代碼,那麼這是如何完成的?查看傳呼機和碎片生命週期

+1

這裏看看我的答案http://stackoverflow.com/questions/21914808/how-to-handle-asynctasks-in-可見這將調用actionbaractivity-fragments-when-viewpager-is-used/24386516#24386516 – LordRaydenMK

+1

完美答案......謝謝你的工作。 – shreyas

回答

27

FragmentPagerAdapter保持附加片段,除了顯示的片段之外,還處於恢復狀態。解決方案是實現一個自定義的OnPageChangeListener,並創建一個新的方法來顯示片段。

1)創建LifecycleManager接口接口將有兩個方法,每個ViewPager的Fragment將實現它。這些方法如下:

public interface FragmentLifecycle { 

    public void onPauseFragment(); 
    public void onResumeFragment(); 

} 

2)讓每一個片段實現接口添加iplements語句給每個類聲明:

public class FragmentBlue extends Fragment implements FragmentLifecycle 
public class FragmentGreen extends Fragment implements FragmentLifecycle 
public class FragmentPink extends Fragment implements FragmentLifecycle 

3)實施中的每個片段的接口方法,以檢查它真正按預期工作,我只是將記錄方法調用,並顯示吐司:

@Override 
public void onPauseFragment() { 
    Log.i(TAG, "onPauseFragment()"); 
    Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onResumeFragment() { 
    Log.i(TAG, "onResumeFragment()"); 
    Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 

4)ViewPager頁面更改您可以設置OnPageChangeListene調用接口方法R ON ViewPager,讓每一次回調時ViewPager顯示另一頁:

pager.setOnPageChangeListener(pageChangeListener); 

5)實施OnPageChangeListener打電話給你定製的生命週期方法

監聽知道新位置,並且可以調用接口方法上的新片段PagerAdapter的幫助。我可以在這裏調用onResumeFragment()來獲取當前的片段和onPauseFragment()。

我還需要存儲當前片段的位置(最初當前位置等於0),因爲我不知道用戶是從左向右滾動還是從右向左滾動。看看我的意思代碼:

private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { 

    int currentPosition = 0; 

    @Override 
    public void onPageSelected(int newPosition) { 

     FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition); 
     fragmentToShow.onResumeFragment(); 

     FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition); 
     fragmentToHide.onPauseFragment(); 

     currentPosition = newPosition; 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { } 

    public void onPageScrollStateChanged(int arg0) { } 
}; 

我沒有寫代碼。全教程這裏:http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

+0

onResumeFragment中的getActivity()可能會返回Null(至少在我的情況下)。解決方案可能是通過界面傳遞上下文(或活動)。例如。 public void onResumeFragment(Activity activity) – Pranaysharma

+3

在我的情況'getItem();'返回片段沒有意見。我已經通過使用'instantiateItem'來解決它。 http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#instantiateItem(android.view.ViewGroup,int) – Alexey

+0

例如:http://www.alexandroid.net/android/fragments/viewpager-fragments-onpageselectedonpageunselected/ – Alexey

1

用戶方法pager.setOffscreenPageLimit(numbr)設置要在堆棧中保留多少片段。

+3

默認值是1。這意味着前一個和下一個片段保持閒置狀態。 – LordRaydenMK

+0

視圖尋呼機總是有一個時間加載最少3頁。我的問題是如何獲得一個回調時,其中一個頁面變得可見。 – shreyas

4

如果你的片段延長android.support.v4.app.Fragment

你可以利用這一點,它爲我工作。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (!isVisibleToUser) { 
     //do sth.. 
    } 
} 
+0

,在此方法中,'getActivity()'或'getContext()'將返回null。我個人更喜歡'onPageSelected()'方法。 –

2

覆蓋setUserVisibleHint()。一旦碎片對用戶可見,該方法將會調用。

0

覆蓋setUserVisibleHint()當片段是用戶