好的。我說我會報告我如何「解決」這個問題。這不是100%完美,但它有效,我認爲它基本上是做正確的事情。
首先,我使用the TabLayout system,在這裏創建一個TabLayout對象,並給它一個ViewPager和FragmentPagerAdapter。
我發現Tab class是最終的。你不能繼承它。這意味着我需要使用Fragments作爲狀態(啓用/禁用)。您可以打開和關閉該選項卡的可點擊,但我向Fragment子類添加了「啓用」標誌。這是我用來查詢選項卡的狀態。
然後我在Adapter子類中創建了一個嵌入類。我實現了ViewPager.OnPageChangeListener(這是一個接口):
private class MyTabPagerListener implements ViewPager.OnPageChangeListener
我補充一點,到TabLayout爲聽衆:
mViewPager.addOnPageChangeListener(new MyTabPagerListener(mTabLayout,this));
然後我實現了 「退出」 的代碼在使用onPageSelected()方法。我試着預測選擇的位置,所以我可以跳到適當的選項卡。整個想法是找出方向。如果下一個選中的標籤被禁用,那麼我們繼續前進:
public void onPageSelected(int position) {
AWrapperBaseFragment fragment = (AWrapperBaseFragment)mAdapter.getItem(position);
mSkipToPosition = -1; // This will inform the "wrap up" function that we need to skip to another tab.
if (!fragment.isEnabled()) {
Log.d(TAG, "Page " + position + " is disabled, selecting a different one.");
int oldPosition = mTabLayout.getSelectedTabPosition();
if (position > oldPosition) {
Log.d(TAG, "Going up.");
for (int i = position + 1; i < mAdapter.getCount(); i++) {
AWrapperBaseFragment comp_fragment = (AWrapperBaseFragment)mAdapter.getItem(i);
if (comp_fragment.isEnabled()) {
mSkipToPosition = i;
break;
}
}
}
if (mSkipToPosition == -1) {
Log.d(TAG, "Going down.");
for (int i = position - 1; i > -1; i--) {
AWrapperBaseFragment comp_fragment = (AWrapperBaseFragment)mAdapter.getItem(i);
if (comp_fragment.isEnabled()) {
mSkipToPosition = i;
break;
}
}
}
}
mSelectedPosition = position;
if (mSkipToPosition == -1) {
mSkipToPosition = mSelectedPosition;
}
Log.d(TAG, "Page selection will " + ((mSelectedPosition != mSkipToPosition) ? ("change from " + mSelectedPosition + " to " + mSkipToPosition) : "not be changed."));
}
此功能設置一個信號燈,這是在狀態變化回調行使:
public void onPageScrollStateChanged(int state) {
Log.d(TAG, "New Scroll State for page " + mSelectedPosition + ": " + state);
if ((state == 0) && (mSkipToPosition > -1) && (mSkipToPosition != mSelectedPosition)) {
Log.d(TAG, "This is a disabled page, so page selection will change from " + mSelectedPosition + " to " + mSkipToPosition + ".");
mViewPager.setCurrentItem(mSkipToPosition, true);
}
}
就像我說的,這是不完善。有一個明顯的猶豫,你仍然看到殘疾標籤內容過去(所以不要在禁用的標籤中留下污點)。
這比iOS解決方案複雜得多,但我認爲它會起作用。我還沒有完成測試。
我想我需要做的是重寫任何代碼是用來選擇「位置」輸入。我不確定那是幹什麼的。我會尋找它。 –
我想我知道我需要去哪裏。我需要用我自己的類來覆蓋ViewPager。我目前正在實例化默認類。 –
[這個小動物](https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter)似乎有我需要的。當我完成後,我會爲後代回答問題。 –