TabLayout基本使用


前言

Tablayout繼承自HorizontalScrollView,可以用作頂部標簽效果、底部導航欄效果。一般多與ViewPager一起使用。

想直接了解如何實現短下滑效果的請看:TabLayout的高級用法

首先上幾個效果圖。

圖:

使用方法

下面我們來看如何使用,

第一步,先在gradle引入支持包

implementation 'com.android.support:design:26.0.0'

第二步,在布局文件中添加布局

<android.support.design.widget.TabLayout
        android:id="@+id/tab_normal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabIndicatorHeight="2dp"
        app:tabMode="fixed"
        app:tabIndicatorColor="#0a0"
        app:tabTextColor="#bbb"
        app:tabSelectedTextColor="#0a0"
        />

屬性解釋:

tabIndicatorHeight:這里是設置標簽橫線的高度,如果不需要橫線,可以設置為0dp
tabIndicatorColor:是用來設置標簽被選中時,顯示的顏色的。
tabTextColor:標簽顯示的默認顏色
tabSelectedTextColor:標簽被選中的時候的顏色
tabMode:這個屬性有兩個取值,一個是fixed,不管tab標簽字多字少,平分當前tablayout寬度的空間大小。一般最多折兩行,還顯示不開的部分,用省略號代替。
              另一個是scrollable,從左到右依次顯示標簽,顯示不開的,可以滾動顯示


上代碼

java代碼:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.design.widget.TabLayout;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tab_normal)
    TabLayout tabNormal;
    @BindView(R.id.tab_icon)
    TabLayout tabIcon;
    @BindView(R.id.tab_more)
    TabLayout tabMore;
    @BindView(R.id.tab_customer)
    TabLayout tabCustomer;
    @BindView(R.id.vp_all)
    ViewPager vpAll;

    List<PageFragment> fgList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);//此處是用的是butterKnife框架,等同於findviewbyid獲取各個控件。
        initViewPager();
        initTabNormal();
    }

    /**
     * 初始化ViewPager,方便后期與tabLayout關聯
     */
    private void initViewPager() {
        fgList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            fgList.add(PageFragment.newInstance("我是標題"+i,"我是內容欄目"+i));
        }
        vpAll.setAdapter(new ViewPagerAdapter(getSupportFragmentManager(), fgList) );
    }

    /**
     * 初始化頂部標簽
     */
    private void initTabNormal() {
        tabNormal.setupWithViewPager(vpAll);
    }

    /**
     * ViewPager的適配器。
     */
    class ViewPagerAdapter extends FragmentPagerAdapter{

        List<PageFragment> fragmentList;
        public ViewPagerAdapter(FragmentManager fm, List<PageFragment> fragmentList) {
            super(fm);
            this.fragmentList=fragmentList;
        }

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

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

        @Override
        public CharSequence getPageTitle(int position) {
            return fragmentList.get(position).getTitle();
        }
    }
}

fragment代碼,fragment的布局文件,就一個ID為tv_content的textview,此處就不在貼代碼了。

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

public class PageFragment extends Fragment {
    String title, content;
    @BindView(R.id.tv_content)
    TextView tvContent;
    Unbinder unbinder;

    public PageFragment() {
    }

    public static PageFragment newInstance(String title, String content) {
        PageFragment fragment = new PageFragment();
        fragment.title = title;
        fragment.content = content;
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_page, container, false);
        unbinder = ButterKnife.bind(this, view);
        tvContent.setText(content);
        return view;
    }

    public String getTitle() {
        return title;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

通過tabLayout方法的setupWithViewPager()方法綁定ViewPager控件的。tab標簽獲取顯示文字,是通過FragmentPagerAdapter的getPageTitle()方法。所以需要對FragmentPagerAdapter的getPageTitle方法進行重寫。

然而,原生控件有很多的呆笨性。比如很多的UI和場景需求都是要求文字下面的短線是一個小於文字的固定值。再比如我們說的作為底部導航欄,如果直接設置tab的icon,會出現icon變形等問題。

所以我這里給一個終極的解決辦法。tab想做成什么樣子,就做成什么樣子。完全自定義。

傳送門:TabLayout的高級用法,自定義TabLayout

 

 

 


免責聲明!

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



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