關於TabLayout與ViewPager在Fragment中嵌套Fragment使用或配合使用的思考


注意:

因為繼承的是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     }

最終效果有如:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM