我有一次加載三頁的ViewPager。如果我從頁面1滑動到頁面2然後滑動到3,則第一頁(片段)將轉到onPause()
。然後,如果我滑動到第二頁,即使頁面1對用戶仍不可見,第一頁也會顯示onResume()
。所以,我的問題是:如何區分代碼中的第一個和第二個頁面?例如,如果我必須在片段可見時運行一段代碼,那麼這是如何完成的?查看傳呼機和碎片生命週期
回答
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) { }
};
onResumeFragment中的getActivity()可能會返回Null(至少在我的情況下)。解決方案可能是通過界面傳遞上下文(或活動)。例如。 public void onResumeFragment(Activity activity) – Pranaysharma
在我的情況'getItem();'返回片段沒有意見。我已經通過使用'instantiateItem'來解決它。 http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#instantiateItem(android.view.ViewGroup,int) – Alexey
例如:http://www.alexandroid.net/android/fragments/viewpager-fragments-onpageselectedonpageunselected/ – Alexey
用戶方法pager.setOffscreenPageLimit(numbr)設置要在堆棧中保留多少片段。
默認值是1。這意味着前一個和下一個片段保持閒置狀態。 – LordRaydenMK
視圖尋呼機總是有一個時間加載最少3頁。我的問題是如何獲得一個回調時,其中一個頁面變得可見。 – shreyas
如果你的片段延長android.support.v4.app.Fragment
你可以利用這一點,它爲我工作。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isVisibleToUser) {
//do sth..
}
}
,在此方法中,'getActivity()'或'getContext()'將返回null。我個人更喜歡'onPageSelected()'方法。 –
覆蓋setUserVisibleHint()
。一旦碎片對用戶可見,該方法將會調用。
覆蓋setUserVisibleHint()當片段是用戶
- 1. 碎片和Android生命週期
- 2. Android的碎片生命週期
- 3. Android查看生命週期
- 4. Android查看傳呼機&列表片段
- 5. 在片段中查看傳呼機
- 6. Android碎片:生命週期方法*總是*在顯示碎片時調用?
- 7. 查看傳呼機內部查看傳呼機刷卡衝突
- 8. iOS 5.0查看生命週期問題
- 9. 在iOS 8.3中查看生命週期
- 10. 片段生命週期
- 11. 哪些生命週期事件在碎片中被調用?
- 12. 使用ActionBar的類生命週期Sherlock Tab碎片
- 13. Android碎片 - 生命週期與交易執行
- 14. 的Android片段生命週期和FragmentManager.add()
- 15. 片段的交換和生命週期
- 16. 查看傳呼機與ExecuteTask
- 17. 傳呼機HTML查看器
- 18. 查看傳呼機雙擊
- 19. 查看傳呼機和列表視圖
- 20. Android:片段到片段生命週期
- 21. UIViewController - 查看事件生命週期和註冊KVO /通知
- 22. 如何反向查看傳呼機?我想開始幻燈片查看傳呼機從右到左
- 23. 生命週期和廣播
- 24. oledbtransaction和oledbconnection生命週期
- 25. Android和生命週期
- 26. RemoteCache,RemoteCacheManager和生命週期
- 27. WCF,Ninject和生命週期
- 28. itextsharp和生命週期
- 29. jQuery週期尋呼機
- 30. Android碎片查看或查看組
這裏看看我的答案http://stackoverflow.com/questions/21914808/how-to-handle-asynctasks-in-可見這將調用actionbaractivity-fragments-when-viewpager-is-used/24386516#24386516 – LordRaydenMK
完美答案......謝謝你的工作。 – shreyas