Android最主流的4种实现Tab的方法

本文详细介绍了Android中4种主流的Tab实现方法:ViewPager、Fragment、FragmentPagerAdapter+ViewPager以及ViewPagerIndicator+ViewPager,包括各自的布局文件、适配器实现、事件监听及样式设置,旨在帮助开发者更好地理解和应用Tab功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tab选项卡几乎成为了App必备的一个功能,它的实现方法也是多种多样,本文将讲解迄今为止最主流的4种实现Tab的方法,包括ViewPager、Fragment、FragmentPagerAdapter和ViewPagerIndicator。

ViewPager实现Tab

下面将通过一个实例来讲解如何用ViewPager实现Tab,效果图如下所示:

上面实现了仿微信Tab导航效果,当点击底部的4个Tab之一时,上面的内容随之切换,同时也可通过左右滑动进行内容切换。
一.底部Tab布局文件
底部Tab的高度限定为70dp并让其子元素横向排列,然后添加4个LinearLayout ,利用layout_weight属性将每个LinearLayout的宽度设置为父元素的四分之一。
底部Tab布局文件bottom.xml代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="@drawable/bottom_bar"
    android:orientation="horizontal">
    <LinearLayout
        android:id="@+id/tab_weixin"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <ImageButton
            android:id="@+id/tab_weixin_img"
            android:layout_width="wrap_content"
            android:layout_height= "wrap_content"
            android:src="@drawable/tab_weixin_pressed"
            android:clickable="false"
            android:background="#00000000"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="#ffffff"
            android:text="微信"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/tab_frd"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <ImageButton
            android:id="@+id/tab_frd_img"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height= "wrap_content"
            android:src="@drawable/tab_find_frd_normal"
            android:background="#00000000"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="#ffffff"
            android:text="朋友"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/tab_address"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <ImageButton
            android:id="@+id/tab_address_img"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height= "wrap_content"
            android:src="@drawable/tab_address_normal"
            android:background="#00000000"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="#ffffff"
            android:text="通讯录"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/tab_settings"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">
        <ImageButton
            android:id="@+id/tab_settings_img"
            android:clickable="false"
            android:layout_width="wrap_content"
            android:layout_height= "wrap_content"
            android:src="@drawable/tab_settings_normal"
            android:background="#00000000"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="#ffffff"
            android:text="设置"/>
    </LinearLayout>
</LinearLayout>

注意:要将ImageButton的clickable的属性设置为false,否则点击ImageButton时,Tab无法实现切换。

二.创建主布局文件
通过include标签将bottom.xml添加到主布局文件中,这样可以优化布局层次,避免混乱。

<include layout="@layout/bottom"/>

然后在主布局文件中加入ViewPager,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </android.support.v4.view.ViewPager>

    <include layout="@layout/bottom"/>
</LinearLayout>

三.为ViewPager添加适配器
首先,创建PagerAdapter适配器,实现destroyItem(),instantiateItem(),getCount(),isViewFromObject()这四个方法。

PagerAdapter pagerAdapter = new PagerAdapter() {

            /**
             * 摧毁View
             * @param container
             * @param position
             * @param object
             */
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
               container.removeView(mViewList.get(position));
            }

            /**
             * 初始化View
             * @param container
             * @param position
             * @return
             */
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                View view = mViewList.get(position);
                container.addView(view);
                return view;
            }

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

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        };

然后为ViewPager添加适配器:

 mViewPager.setAdapter(pagerAdapter);

四.为ViewPager绑定事件监听器
当在手机屏幕上左右滑动时,实现Tab左右切换效果,同时会触发OnPageChangeListener()事件监听器,将对应的图片点亮。

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageSelected(int position) {
                resetImg();
                switch (position){
                    case 0:
                        mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
                        break;
                    case 1:
                        mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
                        break;
                    case 2:
                        mAddressImg.setImageResource(R.drawable.tab_address_pressed);
                        break;
                    case 3:
                        mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

五.主程序代码

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private ViewPager mViewPager;
    private List<View> mViewList = new ArrayList<>();

    private LinearLayout mTabWeixin;
    private LinearLayout mTabFrd;
    private LinearLayout mTabAddress;
    private LinearLayout mTabSetting;

    private ImageButton mWeixinImg;
    private ImageButton mFrdImg;
    private ImageButton mAddressImg;
    private ImageButton mSettingsImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //去掉活动条
        if(getSupportActionBar()!=null){
            getSupportActionBar().hide();
        }
        initView();
        initEvent();
    }

    private void initEvent() {
        mTabWeixin.setOnClickListener(this);
        mTabFrd.setOnClickListener(this);
        mTabAddress.setOnClickListener(this);
        mTabSetting.setOnClickListener(this);
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageSelected(int position) {
                resetImg();
                switch (position){
                    case 0:
                        mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
                        break;
                    case 1:
                        mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
                        break;
                    case 2:
                        mAddressImg.setImageResource(R.drawable.tab_address_pressed);
                        break;
                    case 3:
                        mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });
    }

    private void initView() {
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin);
        mTabFrd = (LinearLayout) findViewById(R.id.tab_frd);
        mTabAddress = (LinearLayout) findViewById(R.id.tab_address);
        mTabSetting = (LinearLayout) findViewById(R.id.tab_settings);

        mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img);
        mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img);
        mAddressImg = (ImageButton) findViewById(R.id.tab_address_img);
        mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img);

        LayoutInflater layoutInflater = LayoutInflater.from(this);
        View viewWeixin = layoutInflater.inflate(R.layout.tab_weixin,null);
        View viewFrd = layoutInflater.inflate(R.layout.tab_frd,null);
        final View viewAddress = layoutInflater.inflate(R.layout.tab_address,null);
        View viewSettings = layoutInflater.inflate(R.layout.tab_settings,null);
        mViewList.add(viewWeixin);
        mViewList.add(viewFrd);
        mViewList.add(viewAddress);
        mViewList.add(viewSettings);

        PagerAdapter pagerAdapter = new PagerAdapter() {

            /**
             * 摧毁View
             * @param container
             * @param position
             * @param object
             */
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
               container.removeView(mViewList.get(position));
            }

            /**
             * 初始化View
             * @param container
             * @param position
             * @return
             */
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                View view = mViewList.get(position);
                container.addView(view);
                return view;
            }

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

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        };
        mViewPager.setAdapter(pagerAdapter);
    }

    @Override
    public void onClick(View v) {
        resetImg();
        switch (v.getId()){
            case R.id.tab_weixin :
                //将图片设置为亮色
                mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
                //设置ViewPager当前显示的View
                mViewPager.setCurrentItem(0);
                break;
            case R.id.tab_frd :
                //将图片设置为亮色
                mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
                //设置ViewPager当前显示的View
                mViewPager.setCurrentItem(1);
                break;
            case R.id.tab_address :
                //将图片设置为亮色
                mAddressImg.setImageResource(R.drawable.tab_address_pressed);
                //设置ViewPager当前显示的View
                mViewPager.setCurrentItem(2);
                break;
            case R.id.tab_settings :
                //将图片设置为亮色
                mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
                //设置ViewPager当前显示的View
                mViewPager.setCurrentItem(3);
                break;
        }
    }

    /**
     * 将所有图片切换成暗色
     */
    private void resetImg() {
        mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
        mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
        mAddressImg.setImageResource(R.drawable.tab_address_normal);
        mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
    }

}

在主程序中,还要为四个LinearLayout绑定监听事件,当点击LinearLayout时,图片点亮,ViewPager切换到对应的内容。
点击下载源码>>

Fragment实现Tab

下面通过Fragment实现上面相同的效果,只是Tab不能通过左右滑动进行切换。
相对于ViewPager实现Tab,采用Fragment方法可以避免所有代码集中在主程序中,将Tab对应显示的内容单独分离出来,方便后期维护。
一.底部Tab布局文件
底部Tab布局文件bottom.xml与“ViewPager实现Tab”中的bottom.xml代码相同。
二.主布局文件
通过include标签将bottom.xml添加到主布局文件中,并添加Fragment组件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </FrameLayout>

    <include layout="@layout/bottom"/>
</LinearLayout>

三.创建对应于每个Tab选项卡的Fragment
接下来创建每个Tab的View页面,实例中含有4个Tab,则需要创建4个Fragment文件。
下面只写一个Fragment进行演示,创建一个类,让其继承Fragment,实现onCreateView()方法。

public class WeixinFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.tab_weixin,container,false);
    }
}

上面R.layout.tab_weixin文件对应的代码为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="30dp"
        android:text="This is tab Weixin"/>
</LinearLayout>

四.实现切换效果
当点击Tab时,实现切换效果——显示对应的Fragment,将图片设置为亮色。
在Android中,对Fragment的操作都是通过FragmentTransaction来执行。

/**
     * 显示指定Tab,并将对应的图片设置为亮色
     * @param i
     */
    private void setSelect(int i) {
        FragmentManager fm = getSupportFragmentManager();  //获得FragmentManager
        FragmentTransaction transaction = fm.beginTransaction(); //开启事务
        hideFragment(transaction);
        switch (i){
            case 0:
                if (weixinFragment==null){
                    weixinFragment = new WeixinFragment();
                    transaction.add(R.id.content, weixinFragment);
                }
                //将图片设置为亮色
                mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
                //显示指定Fragment
                transaction.show(weixinFragment);
                break;
            case 1:
                if (frdFragment==null){
                    frdFragment = new FrdFragment();
                    transaction.add(R.id.content, frdFragment);
                }
                //将图片设置为亮色
                mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
                //显示指定Fragment
                transaction.show(frdFragment);
                break;
            case 2:
                if (addressFragment==null){
                    addressFragment = new AddressFragment();
                    transaction.add(R.id.content, addressFragment);
                }
                //将图片设置为亮色
                mAddressImg.setImageResource(R.drawable.tab_address_pressed);
                //显示指定Fragment
                transaction.show(addressFragment);
                break;
            case 3:
                if (settingFragment==null){
                    settingFragment = new SettingsFragment();
                    transaction.add(R.id.content, settingFragment);
                }
                //将图片设置为亮色
                mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
                //显示指定Fragment
                transaction.show(settingFragment);
                break;
        }
        transaction.commit();  //提交事务
    }
     /**
     * 将所有Fragment隐藏起来
     * @param transaction
     */
    private void hideFragment(FragmentTransaction transaction) {
        if (weixinFragment!=null){
            transaction.hide(weixinFragment);
        }
        if (frdFragment!=null){
            transaction.hide(frdFragment);
        }
        if(addressFragment!=null) {
            transaction.hide(addressFragment);
        }
        if(settingFragment!=null){
            transaction.hide(settingFragment);
        }
    }

切换时,首先先将所有初始化了的Fragment隐藏,然后判断将要切换到的Fragment是否为空,如果为空就将其初始化,并将其添加到FragmentTransaction事物中,接下来将指定为图片设置为亮色、显示指定的Fragment。
五.主程序代码
让MainActivity继承FragmentActivity。

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.LinearLayout;

public class MainActivity extends FragmentActivity implements View.OnClickListener{

    private LinearLayout mTabWeixin;
    private LinearLayout mTabFrd;
    private LinearLayout mTabAddress;
    private LinearLayout mTabSetting;

    private ImageButton mWeixinImg;
    private ImageButton mFrdImg;
    private ImageButton mAddressImg;
    private ImageButton mSettingsImg;

    private WeixinFragment weixinFragment;
    private FrdFragment frdFragment;
    private AddressFragment addressFragment;
    private SettingsFragment settingFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
        setSelect(0);  //显示第一个Tab
    }

    private void initEvent() {
        mTabWeixin.setOnClickListener(this);
        mTabFrd.setOnClickListener(this);
        mTabAddress.setOnClickListener(this);
        mTabSetting.setOnClickListener(this);
    }

    private void initView() {
        mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin);
        mTabFrd = (LinearLayout) findViewById(R.id.tab_frd);
        mTabAddress = (LinearLayout) findViewById(R.id.tab_address);
        mTabSetting = (LinearLayout) findViewById(R.id.tab_settings);

        mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img);
        mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img);
        mAddressImg = (ImageButton) findViewById(R.id.tab_address_img);
        mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img);
    }

    @Override
    public void onClick(View v) {
        resetImg();
        switch (v.getId()){
            case R.id.tab_weixin :
                setSelect(0);
                break;
            case R.id.tab_frd :
                setSelect(1);
                break;
            case R.id.tab_address :
                setSelect(2);
                break;
            case R.id.tab_settings :
                setSelect(3);
                break;
        }
    }

    /**
     * 显示指定Tab,并将对应的图片设置为亮色
     * @param i
     */
    private void setSelect(int i) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        hideFragment(transaction);
        switch (i){
            case 0:
                if (weixinFragment==null){
                    weixinFragment = new WeixinFragment();
                    transaction.add(R.id.content, weixinFragment);
                }
                //将图片设置为亮色
                mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
                //显示指定Fragment
                transaction.show(weixinFragment);
                break;
            case 1:
                if (frdFragment==null){
                    frdFragment = new FrdFragment();
                    transaction.add(R.id.content, frdFragment);
                }
                //将图片设置为亮色
                mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
                //显示指定Fragment
                transaction.show(frdFragment);
                break;
            case 2:
                if (addressFragment==null){
                    addressFragment = new AddressFragment();
                    transaction.add(R.id.content, addressFragment);
                }
                //将图片设置为亮色
                mAddressImg.setImageResource(R.drawable.tab_address_pressed);
                //显示指定Fragment
                transaction.show(addressFragment);
                break;
            case 3:
                if (settingFragment==null){
                    settingFragment = new SettingsFragment();
                    transaction.add(R.id.content, settingFragment);
                }
                //将图片设置为亮色
                mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
                //显示指定Fragment
                transaction.show(settingFragment);
                break;
        }
        transaction.commit();
    }

    /**
     * 将所有Fragment隐藏起来
     * @param transaction
     */
    private void hideFragment(FragmentTransaction transaction) {
        if (weixinFragment!=null){
            transaction.hide(weixinFragment);
        }
        if (frdFragment!=null){
            transaction.hide(frdFragment);
        }
        if(addressFragment!=null) {
            transaction.hide(addressFragment);
        }
        if(settingFragment!=null){
            transaction.hide(settingFragment);
        }
    }

    /**
     * 将所有图片切换成暗色
     */
    private void resetImg() {
        mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
        mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
        mAddressImg.setImageResource(R.drawable.tab_address_normal);
        mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
    }
}

注意:前面出现的 Fragment,FragmentManager,FragmentTransaction,FragmentActivity都是导入android.support.v4.app包下的类,不要与android.app.Fragment混淆。

点击下载源码>>

FragmentPagerAdapter+ViewPager实现Tab

FragmentPagerAdapter+ViewPager实现Tab,既能左右滑动切换Tab,又可将Fragment单独分离出来,方便维护。
一.布局文件
底部Tab布局文件bottom.xml和主布局文件与“Fragment实现Tab”中的相应文件相同。
二.每个Tab选项卡对应的Fragment
每个Tab选项卡对应的Fragment与“Fragment实现Tab”的对应文件相同。
三.为ViewPager设置FragmentPagerAdapter适配器
先创建一个List<Fragment>

        List<Fragment> listFragment = new ArrayList<>();
        weixinFragment = new WeixinFragment();
        frdFragment = new FrdFragment();
        addressFragment = new AddressFragment();
        settingFragment = new SettingsFragment();
        listFragment.add(weixinFragment);
        listFragment.add(frdFragment);
        listFragment.add(addressFragment);
        listFragment.add(settingFragment);

创建FragmentPagerAdapter需要传入一个FragmentManager参数,可以通过getSupportFragmentManager()方法获取FragmentManager。

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return listFragment.get(position);
            }

            @Override
            public int getCount() {
                return listFragment.size();
            }
        };
        viewPager.setAdapter(adapter);

四.为ViewPager设置监听事件
当在手机屏幕上左右滑动时,Tab内容左右切换,并触发OnPageChangeListener监听器,将对应的Tab图片设置为亮色。

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageSelected(int position) {
                setTab(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

上面setTab(position)对应的方法为:

    /**
     * 将指定的Tab图片设置为亮色
     * @param i
     */
    private void setTab(int i) {
        resetImg();
        switch (i){
           case 0:
               mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
               break;
           case 1:
               mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
               break;
           case 2:
               mAddressImg.setImageResource(R.drawable.tab_address_pressed);
               break;
           case 3:
               mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
               break;
         }
     }
     /**
     * 将所有图片切换成暗色
     */
    private void resetImg() {
        mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
        mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
        mAddressImg.setImageResource(R.drawable.tab_address_normal);
        mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
    }

五.主程序代码

package com.example.administrator.tabproject;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends FragmentActivity implements View.OnClickListener{

    private ViewPager viewPager;
    private List<Fragment> listFragment;

    private LinearLayout mTabWeixin;
    private LinearLayout mTabFrd;
    private LinearLayout mTabAddress;
    private LinearLayout mTabSetting;

    private ImageButton mWeixinImg;
    private ImageButton mFrdImg;
    private ImageButton mAddressImg;
    private ImageButton mSettingsImg;

    private WeixinFragment weixinFragment;
    private FrdFragment frdFragment;
    private AddressFragment addressFragment;
    private SettingsFragment settingFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
        setSelect(1);
    }

    private void initEvent() {
        mTabWeixin.setOnClickListener(this);
        mTabFrd.setOnClickListener(this);
        mTabAddress.setOnClickListener(this);
        mTabSetting.setOnClickListener(this);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageSelected(int position) {
                setTab(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });
    }

    private void initView() {
        viewPager = (ViewPager) findViewById(R.id.view_pager);

        mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin);
        mTabFrd = (LinearLayout) findViewById(R.id.tab_frd);
        mTabAddress = (LinearLayout) findViewById(R.id.tab_address);
        mTabSetting = (LinearLayout) findViewById(R.id.tab_settings);

        mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img);
        mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img);
        mAddressImg = (ImageButton) findViewById(R.id.tab_address_img);
        mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img);

        listFragment = new ArrayList<>();
        weixinFragment = new WeixinFragment();
        frdFragment = new FrdFragment();
        addressFragment = new AddressFragment();
        settingFragment = new SettingsFragment();
        listFragment.add(weixinFragment);
        listFragment.add(frdFragment);
        listFragment.add(addressFragment);
        listFragment.add(settingFragment);

        FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return listFragment.get(position);
            }

            @Override
            public int getCount() {
                return listFragment.size();
            }
        };
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tab_weixin :
                setSelect(0);
                break;
            case R.id.tab_frd :
                setSelect(1);
                break;
            case R.id.tab_address :
                setSelect(2);
                break;
            case R.id.tab_settings :
                setSelect(3);
                break;
        }
    }

    private void setSelect(int i) {
        setTab(i);
        viewPager.setCurrentItem(i);
    }

    /**
     * 将指定的Tab图片设置为亮色
     * @param i
     */
    private void setTab(int i) {
        resetImg();
        switch (i){
           case 0:
               mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
               break;
           case 1:
               mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
               break;
           case 2:
               mAddressImg.setImageResource(R.drawable.tab_address_pressed);
               break;
           case 3:
               mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
               break;
         }
     }

    /**
     * 将所有图片切换成暗色
     */
    private void resetImg() {
        mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
        mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
        mAddressImg.setImageResource(R.drawable.tab_address_normal);
        mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
    }
}

注意:前面出现的 Fragment,FragmentActivity,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。

点击下载源码>>

ViewPagerIndicator+ViewPager实现Tab

使用开源控件ViewPagerIndicator+ViewPager实现Tab,即可点击Tab进行切换,又可左右滑动切换。同时可以大大简化代码,方便维护。
下面实现一个Tab例子,效果图如下所示:

一.AndroidStudio导入ViewPagerIndicator
1.在app上右击,选择open module Settings
这里写图片描述
2.点击Dependencies,然后点击右侧的“+”,选择1.Library dependency
这里写图片描述
3.在输入框中输入ViewPagerIndicator,点击旁边的搜索图标,出现匹配的文件后,点击OK
这里写图片描述
二.主布局文件
主布局文件包含TabPageIndicator和ViewPager两个组件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/tab_page_indicator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"/>
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

三.Tab内容对应的布局文件
布局文件fragment.xml中采用相对布局,只有一个TextView。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/id_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:textStyle="bold"
        android:gravity="center"
        android:layout_centerInParent="true"/>
</RelativeLayout>

四.创建FragmentPagerAdapter适配器
创建FragmentPagerAdapter适配器,需要实现getItem(),getCount(),etPageTitle()三个方法。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class TabAdapter extends FragmentPagerAdapter {

    public static String[] TITLES = new String[]{"Tab1","Tab2","Tab3","Tab4","Tab5"};

    public TabAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        TabFragment tabFragment = new TabFragment(position);
        return tabFragment;
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }
}

五.创建TabFragment类
TabFragment需要实现Fragment,在onCreateView()方法中创建Tab对应显示的页面内容。

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

@SuppressLint("ValidFragment")
public class TabFragment extends Fragment {

    private int pos;

    @SuppressLint("ValidFragment")
    public TabFragment(int pos) {
        this.pos = pos;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment,container,false);
        TextView textView = (TextView) view.findViewById(R.id.id_tv);
        textView.setText(TabAdapter.TITLES[pos]);
        return view;
    }
}

六.主程序代码
在主程序中,让MainActivity继承FragmentActivity,并为ViewPager设置适配器,同时为TabPageIndicator设置ViewPager。

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

import com.viewpagerindicator.TabPageIndicator;

public class MainActivity extends FragmentActivity {

    private TabPageIndicator tabPageIndicator;
    private ViewPager viewPager;
    private TabAdapter adpater;

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

    private void initView() {
        tabPageIndicator = (TabPageIndicator) findViewById(R.id.tab_page_indicator);
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        adpater = new TabAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adpater);    //为ViewPager设置适配器
        tabPageIndicator.setViewPager(viewPager);  //为TabPageIndicator设置ViewPager
    }
}

注意:前面出现的 Fragment,FragmentActivity,FragmentManager,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。

七.为Tab设置样式
在style.xml中加入如下代码:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
<style name="MyTheme" parent="AppTheme">
        <item name="vpiTabPageIndicatorStyle">@style/MyWidget.TabPageIndicator</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:animationDuration">5000</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

    <style name="MyWidget.TabPageIndicator" parent="Widget">
        <item name="android:gravity">center</item>
        <item name="android:background">@drawable/vpi__tab_indicator</item>
        <item name="android:paddingLeft">22dip</item>
        <item name="android:paddingRight">22dip</item>
        <item name="android:paddingTop">8dp</item>
        <item name="android:paddingBottom">8dp</item>
        <item name="android:textAppearance">@style/MyTextAppearance.TabPageIndicator</item>
        <item name="android:textSize">16sp</item>
        <item name="android:maxLines">1</item>
    </style>

    <style name="MyTextAppearance.TabPageIndicator" parent="Widget">
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">#262626</item>
    </style>

并将AndroidManifest.xml中application标签的android:theme属性改为@style/MyTheme

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/MyTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

点击下载源码>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值