2013-08-30 15 views
0

所以我想實現一種方法,使用我所有的Fragment類在我的MainActivity.java類中創建一個Array List<? extends Fragment>,該類是ArrayList,其中擴展Fragment類的不同對象。我將如何在Android中實現碎片通用ArrayList?

我這樣做的主要原因是使用android.support.v4.jar支持庫ViewPager視圖加載碎片。

這是我迄今爲止,但我不能添加不同的對象是extend Fragment到我ArrayList

public List<? extends Fragment> getFragments(){ 
    List<? extends Fragment> ipsumFragments = new ArrayList<Fragment>(); 
    ipsumFragments.add(BaconIpsumFragment.newInstance()); 
    ipsumFragments.add(BuseyIpsumFragment.newInstance()); 
    ipsumFragments.add(LoremIpsumFragment.newInstance()); 

    return ipsumFragments; 
} 

我只是想把我的頭周圍採用ViewPager和多fragments.If任何人都可以幫助我,我將不勝感激。

這裏是我的第一個Fragment類,其他人是完全一樣的,但不同的命名,並使用不同的XML佈局

public class BaconIpsumFragment extends Fragment{ 

public static final BaconIpsumFragment newInstance(){ 

    BaconIpsumFragment baconFragment = new BaconIpsumFragment(); 
    Bundle args = new Bundle(); 
    baconFragment.setArguments(args); 
    return baconFragment; 
} 

@Override 
public void onAttach(Activity activity){ 
    // Attempt to attach to the parent activity 
    super.onAttach(activity); 
} 

// Called when the parent activity creates the fragment 
@Override 
public void onCreate(Bundle savedInstanceState){ 
    // Perform the default behavior 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    super.onCreateView(inflater, container, savedInstanceState); 
    return inflater.inflate(R.layout.bacon_fragment, container, false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    // Last attempt to change any variables 
    super.onActivityCreated(savedInstanceState); 
} 

} 

並全面實施我的活動。嘗試添加片段實例時,我的錯誤發生在getFragments()方法中。

public class MainActivity extends FragmentActivity { 

private ActionBar tabbedActionBar = null; 
private String [] ipsumsArray = null; 
private Resources resources = null; 
private FragmentManager manager = null; 
private FragmentTransaction transaction = null; 

private List<Fragment> mIpsumFragments = null; 
private LoremIpsumViewPager pagerAdapter = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Get the resources object 
    resources = getResources(); 
    // get the String array from resources 
    ipsumsArray = resources.getStringArray(R.array.ipsums_array); 

    // Get all the fragments that we will attempt to display 
    mIpsumFragments = getFragments(); 

    // get a reference to the action bar 
    tabbedActionBar = getActionBar(); 
    // set the navigation mode for the action bar 
    tabbedActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    for (int i = 0; i < ipsumsArray.length; i++){ 
     Tab tab = tabbedActionBar.newTab(); 
     tab.setText(ipsumsArray[i]); 
     tab.setTabListener(tabListener); 
     tabbedActionBar.addTab(tab); 
    } 

//  setDefaultTab(); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private TabListener tabListener = new TabListener(){ 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction arg1) { 

     // Get the fragment manager 
     manager = getFragmentManager(); 
     transaction = manager.beginTransaction(); 


     int tabSelected = tab.getPosition(); 


    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

}; 



private List<Fragment> getFragments(){ 
    List<Fragment> ipsumFragments = new ArrayList<Fragment>(); 

    ipsumFragments.add(BaconIpsumFragment.newInstance()); 
    ipsumFragments.add(BuseyIpsumFragment.newInstance()); 
    ipsumFragments.add(LoremIpsumFragment.newInstance()); 

    return ipsumFragments; 
} 

} 
+0

我不敢相信你在將實例添加到'List'時遇到了這個錯誤。這根本不可能。就像您可以擁有一個持有子類對象的超類引用,您可以將一個子類實例添加到超類列表中。 –

+0

請再次確認。我不知道是否有一些Android相關的問題,因爲我不是一個Android的傢伙。 –

+0

我看到這個教程http://architects.dzone.com/articles/android-tutorial-using,他們似乎沒有這個問題。 。 。 –

回答

4

根本沒有必要使用通配符。只需要聲明您的列表如下:

List<Fragment> ipsumFragments = new ArrayList<Fragment>(); 

它不會限制你在列表中添加的Fragment只是實例。您也可以在其中添加Fragment的子類實例。然後將您的方法的返回類型更改爲List<Fragment>

將列表聲明爲List<? extends Fragment>的用途是您可以指定該引用,Fragment的任何子類的列表。所以,你可以分配List<BaconIpsumFragment>,List<LoremIpsumFragment>,就是這樣。這就是爲什麼你不能在這樣的列表中添加任何子類的實例,因爲你不知道你實際上在哪個列表下。因此,您可能會嘗試將BaconIpsumFragment添加到List<LoremIpsumFragment>中,這當然不正確。

+0

當我進行此更改時,Eclipse告訴我添加的不是適用於BaconIpsumFragment類型,它是一個擴展Fragment的類,這個類中的newInstance()方法返回一個BaconIpsumFragment,我應該把它轉換成一個片段嗎? –

+0

@ inner_class7。如果你添加一個子類, 'Fragment'的實例。你能顯示你的代碼和類結構嗎? –

+0

這裏我添加了其他類之一。剩下的只是使用不同的xml和不同的類名。 –