2013-09-26 45 views
2

我想要一個帶有4個可滾動選項卡的選項卡。我實現了下面的例子,它的工作原理:FragmentPagerAdapter中的片段

mAdapter = new MyAdapter(getSupportFragmentManager()); 
mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(mAdapter); 

...

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; //NUM_ITEMS=4 
    } 
    @Override 
    public ArrayListFragment getItem(int position) { 
     return ArrayListFragment.newInstance(position); 
    } 
    @Override 
    public CharSequence getPageTitle(int position) { 
     switch(position) { 
     case 0: 
      return "TAB1"; 
     case 1: 
      return "TAB2"; 
     case 2: 
      return "TAB3"; 
     case 3: 
      return "TAB4"; 
     default: 
      return "ERROR"; 
     }  
    } 
} 

...

public static class ArrayListFragment extends ListFragment { 
    int mNum; 

    static ArrayListFragment newInstance(int num) { 
     ArrayListFragment f = new ArrayListFragment(); 

     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     switch(mNum) { 
     case 0: 
      View v0 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v0; 
     case 1: 
      View v1 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v1; 
     case 2: 
      View v2 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v2; 
     case 3: 
      View v3 = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return v3; 
     default: 
      View vd = inflater.inflate(R.layout.fragment_pager_list, container, false); 
      return vd;    
     } 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, Titles)); 
    } 
    //Titles={"TAB1", "TAB2", "TAB3", "TAB4"} 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Log.i("FragmentList", "Item clicked: " + id); 
    } 


} 

其中fragment_pager_list的佈局,我把每一個觀點是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:drawable/gallery_thumb"> 

<TextView android:id="@+id/text" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="HELLO WORLD"/> 

<!-- The frame layout is here since we will be showing either 
the empty view or the list view. --> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" > 
    <!-- Here is the list. Since we are using a ListActivity, we 
     have to call it "@android:id/list" so ListActivity will 
     find it --> 
    <ListView android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:drawSelectorOnTop="false"/> 

    <!-- Here is the view to show if the list is emtpy --> 
    <TextView android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="No items."/> 

</FrameLayout> 

問題是我想爲每個選項卡在每個視圖中放置不同的佈局。 我試圖修改代碼,以便「ArrayListFragment」從「Fragment」而不是「ListFragment」繼承來加載不包含「ListView」但「RelativeLayout」或「LinearLayout」但不能使其工作的佈局。

如果有人能幫助我,我需要加載不同的視圖在選項卡上,並且它們包含除ListView以外的其他元素。

非常感謝。

+0

通過使用ListFragment自動檢測佈局中的ListView ...我必須在佈局中實現的方法檢測它使用Fragment而不是ListFragment,並可以在每個選項卡的視圖中看到它? A <片段...>? 謝謝。 – KryNaC

回答

3

你最好爲不同的佈局製作每個片段。 您可以將addFragment(Fragment fragment)方法添加到MyAdapter

mAdapter = new MyAdapter(getSupportFragmentManager()); 
for(int i=0; i<4; i++) { 
    Fragment fragment = null; 
    switch(i) { 
    case 0: 
     fragment = FirstFragment.newInstance(); 
     break; 
    case 1: 
     fragment = SecondFragment.newInstance(); 
     break; 
    case 2: 
     fragment = ThirdFragment.newInstance(); 
     break; 
    case 3: 
     fragment = FourthFragment.newInstance(); 
     break; 
    } 
    mAdapter.addFragment(fragment); 
} 
mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(mAdapter); 

MyAdapter:適配器是一個簡單的容器。

public static class MyAdapter extends FragmentPagerAdapter { 
    private List<Fragment> mFragmentList; 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     mFragmentList = new ArrayList<Fragment>(); 
    } 

    publid void addFragment(Fragment fragment) { 
     mFragmentList.add(fragment); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return ((CustomFragment) mFragmentList.get(position)).getPageTitle(); 
    } 
} 

CustomFragment:將每個片段的通用方法。

public abstract class CustomFragment extends Fragment { 
    public abstract Fragment newInstance(); 
    public abstract String getPageTitle(); 
} 

FirstFragment:爲每個片段膨脹不同的佈局。

public class FirstFragment extends CustomFragment { 

    @Override 
    public Fragment newInstance() { 
     Fragment f = new FirstFragment(); 
     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     View view = inflater.inflate(R.layout.LAYOUT_ID_FOR_FIRST_FRAGMENT, container, false); 

     // Some codes for layout such as findViewById 

     return view; 
    } 

    @Override 
    public String getPageTitle() { 
     // return TITLE_FOR_FRAGMENT 
    } 
} 

我希望這個答案能幫到你。

+0

感謝Raegon的幫助。我正在測試代碼,但在第一個開關中調用的每一個片段(FirstFragment,...)方法中缺少「newInstance」方法。 – KryNaC

+0

此外,FirstFragment應該是靜態方法,在開關中調用它不是? – KryNaC

+0

我向'CustomFragment'添加了'newInstance'方法。 – Raegon

相關問題