2014-05-23 44 views
0

ViewPager將當前片段更改爲下一個或上一個片段之前,必須通過調用定製Fragment的方法來完成驗證。要做到這一點,我可以保留每個片段的引用,或者通過標籤查找它們。下面的代碼:使用FragmentPagerAdapter時維護片段引用或按標籤查找

//=== Inside Activity ===// 
Fragment fragments[] = new Fragment[5] 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // .. init code 

    fragments[0] = new FragmentA(); 
    fragments[1] = new FragmentB(); 
    // ... same for 5 fragments in this particular case 
} 

private void validateFragmentBeforeMovingToNextOrPrevious(int position) { 
    ((MyValidationFragment)fragments[position]).validate(); 
} 

//=== inside FragmentPagerAdapter ===// 
@Override 
public Fragment getItem(position) { 
    return fragments[position]; 
} 

對戰

//=== inside Activity ===// 
private void validateFragmentBeforeMovingToNextOrPrevious(int position) { 
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(
       "android:switcher:" + viewPager.getId() + ":" + 
       fragmentPagerAdapter.getItemId(position)); 

    ((MyValidationFragment)fragment).validate(); 
} 

//=== inside FragmentPagerAdapter ===// 
@Override 
public Fragment getItem(position) { 
    switch(position) { 
     case 0: return new FragmentA(); 
     case 1: return new FragmentB(); 
     // ... etc... 
    } 
} 

回答

1

我不能發現一個實際的問題,所以我會假設你正在試圖獲得關於採取哪種方法反饋。我個人比較喜歡沒有,所以這是我會怎麼做:

interface Validator { 
    void validate(); 
} 

class MyValidationFragment extends Fragment implements Validator { 
    // Implementation follows. 
} 

class MyPager extends FragmentPagerAdapter { 

    private final SparseArray<Validator> mValidators = new SparseArray<Validator>(); 

    @Override 
    public Fragment getItem(int position) { 
    final MyValidationFragment fragment = getFragmentSomehow(); 
    mValidators.put(position, fragment); 
    return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
    mValidators.remove(position); 
    super.destroyItem(container, position, object); 
    } 

    private void validateFragment(int position) { 
    mValidators.get(position).validate(); 
    } 

} 

但我明白,這可能不是你要找的內容,因爲它只是一個要考慮的做法。

+0

我喜歡你的建築,我正在做這件事。謝啦! –

+0

很高興我能幫到你! – curtisLoew

+0

快速問題,爲什麼'SparseArray'而不是'ArrayList'? –

相關問題