注意:
因為繼承的是Fragment,所以getSupportFragmentManager()與getFragmentManager()方法無法使用,這里需要用到getChildFragmentManager()方法;
(用getFragmentManager()方法並不會報錯,但到時候運行的時候會出問題,查了好久才知道這個錯誤)
統一Fragment類型,要么為“android.support.v4.app.Fragment”,要么為“android.app.Fragment”;
明白需求類型,正確使用adpter:FragmentPagerAdapter、PagerAdapter等等;Fragment中嵌套Fragment可以使用FragmentPagerAdapter。
先是TabLayout:
貼出xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context="com.xxx.xxx.xxx.xxxFragment" android:orientation="vertical"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="50dp" app:tabSelectedTextColor="#000" app:tabTextColor="#939292" app:tabTextAppearance="@style/TabLayoutTextStyle" app:tabIndicatorColor="#000" app:tabBackground="@null" app:tabIndicatorHeight="1dp" app:tabGravity="fill"/> <View android:layout_width="match_parent" android:layout_height="3dp" android:layout_below="@+id/tabLayout" android:background="@drawable/toolbar"> </View> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
View起裝飾作用,若不使用ViewPager則可去掉xml中的ViewPager定義。
再是對TabLayout屬性的一些介紹及與ViewPager配合使用的一些思考:
1.改變選中字體的顏色 app:tabSelectedTextColor="xxx" 2.改變未選中字體的顏色 app:tabTextColor="xxx" 3.改變指示器下標的顏色 app:tabIndicatorColor="xxx" 4.改變整個TabLayout的顏色 app:tabBackground="xxx" 5.設置指示器下標的高度: app:tabIndicatorHeight="xxdp" 6.設置Tab內部的子控件的Padding: app:tabPadding="xxdp" app:tabPaddingTop="xxdp" app:tabPaddingStart="xxdp" app:tabPaddingEnd="xxdp" app:tabPaddingBottom="xxdp" 7.設置整個TabLayout的Padding: app:paddingEnd="xxdp" app:paddingStart="xxdp" 8.內容的顯示模式 app:tabGravity="center"//居中,如果是fill,則是充滿 9.設置最大的tab寬度: app:tabMaxWidth="xxdp" 10.設置最小的tab寬度: app:tabMinWidth="xxdp" 11.TabLayout開始位置的偏移量: app:tabContentStart="100dp"
有時候在xml中設置TabLayout的屬性可能不會起作用(遇到過但還不清楚為什么),這時候就需要在邏輯中對TabLayout屬性進行設置,如:
tabLayout.setSelectedTabIndicatorColor(Color.BLACK);//設置下標顏色 tabLayout.setSelectedTabIndicatorHeight(1);//設置下標高度
使用的TabLayout可以沒有文字,在設置中如:
tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.xxx));
若不配合ViewPager使用可以用以下方法進行監聽聯動其他Fragment:
1 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){ 2 @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 3 @Override 4 public void onTabSelected(TabLayout.Tab tab) { 5 Log.e("TAG","tab position:"+tab.getPosition()); 6 FragmentManager fm = xxxFragment.this.getChildFragmentManager(); 7 //開啟事務 8 FragmentTransaction transaction = fm.beginTransaction(); 9 Intent intent; 10 switch (tab.getPosition()){ 11 case 0:{ 12 if (mxxxFragment == null) { 13 mxxxFragment = new xxxFragment(); 14 Bundle bundle = new Bundle(); 15 bundle.putInt("xx", xx); 16 mxxxFragment.setArguments(bundle); 17 } 18 transaction = fm.beginTransaction(); 19 transaction.replace(R.id.xxx, mxxxFragment); //連接TabLayout下的Fragment需要放置的位置 20 transaction.commit(); 21 break; 22 } 23 case 1:{ 24 intent = new Intent(getActivity(), xxxActivity.class); 25 startActivity(intent); 26 break; 27 default: 28 break; 29 } 30 } 31 @Override 32 public void onTabUnselected(TabLayout.Tab tab) { 33 34 } 35 @Override 36 public void onTabReselected(TabLayout.Tab tab) { 37 } 38 });
或啟一個list放置動態建立fragment(在onCreateView方法中完成,可配合ViewPager中Adapter的定義):
1 List<Fragment> fragments=new ArrayList<Fragment>(); 2 fragments.add(new xxxFragment()); 3 fragments.add(new xxxFragment());
若想配合ViewPager使用:
1 private TabLayout mTabLayout; 2 private ViewPager mViewPager; 3 FragmentPagerAdapter mAdapter; 4 //對TabLayout以及ViewPager的監聽,以下皆在onCreateView方法中完成 5 mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 6 mTabLayout = (TabLayout) view.findViewById(R.id.tabLayout); 7 FragmentManager man = AboutFragment.this.getChildFragmentManager(); 8 mTabLayout.setTabMode(TabLayout.MODE_FIXED);//設置tab模式,當前為系統默認模式 9 mAdapter= new FragmentAdapter(man,fragments); 10 mViewPager.setAdapter(mAdapter);//給ViewPager設置適配器 11 mTabLayout.setupWithViewPager(mViewPager);//將TabLayout和ViewPager關聯起來。 12 mTabLayout.setTabsFromPagerAdapter(mAdapter);//給Tabs設置適配器
再是對adpter的定義:
1 public class FragmentAdapter extends FragmentPagerAdapter { 2 private String [] title = {"已關注","你"}; 3 private List<Fragment> fragmentList; 4 public FragmentAdapter(FragmentManager fm, List<Fragment> fragmentList) { 5 super(fm); 6 this.fragmentList = fragmentList; 7 } 8 9 @Override 10 public Fragment getItem(int position) { 11 return fragmentList.get(position);//或返回具體的fragment並傳值 12 } 13 @Override 14 public int getCount() { 15 return fragmentList.size(); 16 } 17 @Override 18 public CharSequence getPageTitle(int position) { 19 return title[position]; 20 } 21 }
若遇到報錯,請檢查關於fragment的import是否統一,如:
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter;
值得注意的是:
如果需要進行fragment間數據的傳遞(如聯網時傳遞用戶數據),則需在每個fragment中加入如:
1 public static xxxFragment newInstance(String param1) { 2 xxxFragment fragment = new xxxFragment(); 3 Bundle args = new Bundle(); 4 args.putString("agrs1", param1); 5 fragment.setArguments(args); 6 return fragment; 7 }
最終效果有如:

