2016-05-04 23 views
3

我對Android編程相當陌生,所以這[有希望|很可能]是一個愚蠢的問題。在使用FragmentPagerAdapter滑動時跳過片段

我正在複製沿底部有4個選項卡的iOS應用程序的行爲。

最初,唯一活躍的兩個是第一個和最後一個。中心2只有在成功搜索後才能激活。

我喜歡Android的滑動改變行爲(我可以將它添加到iOS應用程序中)。

但是,我不確定跳過兩個不活動中心的正確方法,因此從右向左滑動從第一個標籤到最後一個(反之亦然)。

我在發佈的API中看不到任何鉤子。我想我可以把getItem()中返回的項目弄亂了(而不是發送一箇中間的項目,我直接去到最後一個),但是我想知道這是否是正確的方法。我擔心,因爲你在getItem()上實例化實例,所以這意味着它可能不是最好的地方。

對此的評論?我知道使用Android時,通常有十幾種方法可以做某些事情,但通常只有一種或兩種「正確」方式。

我想以正確的方式做到這一點。

+0

我想我需要做的是重寫任何代碼是用來選擇「位置」輸入。我不確定那是幹什麼的。我會尋找它。 –

+0

我想我知道我需要去哪裏。我需要用我自己的類來覆蓋ViewPager。我目前正在實例化默認類。 –

+0

[這個小動物](https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter)似乎有我需要的。當我完成後,我會爲後代回答問題。 –

回答

0

好的。我說我會報告我如何「解決」這個問題。這不是100%完美,但它有效,我認爲它基本上是做正確的事情。

首先,我使用the TabLayout system,在這裏創建一個TabLayout對象,並給它一個ViewPagerFragmentPagerAdapter

我發現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解決方案複雜得多,但我認爲它會起作用。我還沒有完成測試。

相關問題