Tablayout和ViewPager的结合使用Tablayout标题右上角加标记

目前项目中用到Tablayout和ViewPager的结合使用,本来这个很简单可以实现,但是项目要求Tablayout标题右上角加数字标记。这就不好弄了,怎么办呢,只能给标题重新设置布局,下面就讲讲给Tablayout标题重设布局的过程。

之前结合RecyclerView的使用http://blog.csdn.net/pengyu1801/article/details/51172254

核心实现

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

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

/**
 * 类名:
 * 类描述:实现TabLayout + viewpager + fragment 并TabLayout标题右上角有数字标记
 * 创建人:fly
 * 创建日期: 2017/2/2.
 * 版本:V1.0
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private List<String> mPageTitleList = new ArrayList<String>();
    private List<Fragment> mFragmentList = new ArrayList<Fragment>();
    private List<Integer> mBadgeCountList = new ArrayList<Integer>();
    private List<BadgeView> mBadgeViews;

    private SimpleFragmentPagerAdapter mPagerAdapter;
    private TabLayout mTabLayout;
    private ViewPager mViewPager;


    private int count = 0;

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

        initFragments();
        initView();
    }

    private void initFragments() {
        // 初始化标题
        mPageTitleList.add("Tab1");
        mPageTitleList.add("Tab2");
        mPageTitleList.add("Tab3");

        // 初始化标题右上角的数字
        mBadgeCountList.add(6);
        mBadgeCountList.add(count++);
        mBadgeCountList.add(166);

        // 初始化对应的fragment
        for (int i = 0; i < mPageTitleList.size(); i++) {
            mFragmentList.add(PageFragment.getInstance(mPageTitleList.get(i)));
        }
    }

    private void initView() {
        findViewById(R.id.btn_add_badge).setOnClickListener(this);

        mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        mPagerAdapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager(),
                        mFragmentList, mPageTitleList, mBadgeCountList);
        mViewPager.setAdapter(mPagerAdapter);
        mTabLayout.setupWithViewPager(mViewPager);

//        initBadgeViews();
        setUpTabBadge();
    }

    /**初始化标题右上角标记*/
//    private void initBadgeViews() {
//        if (mBadgeViews == null) {
//            mBadgeViews = new ArrayList<>();
//            for (int i = 0; i < mFragmentList.size(); i++) {
//                BadgeView tmp = new BadgeView(this);
//                tmp.setBadgeMargin(0, 6, 10, 0);
//                tmp.setTextSize(10);
//                mBadgeViews.add(tmp);
//            }
//        }
//    }

    /**
     * 设置Tablayout上的标题的角标
     */
    private void setUpTabBadge() {
        // 1. 最简单
//        for (int i = 0; i < mFragmentList.size(); i++) {
//            mBadgeViews.get(i).setTargetView(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(i));
//            mBadgeViews.get(i).setText(formatBadgeNumber(mBadgeCountList.get(i)));
//        }

        // 2. 最实用
        for (int i = 0; i < mFragmentList.size(); i++) {
            TabLayout.Tab tab = mTabLayout.getTabAt(i);

            // 更新Badge前,先remove原来的customView,否则Badge无法更新
            View customView = tab.getCustomView();
            if (customView != null) {
                ViewParent parent = customView.getParent();
                if (parent != null) {
                    ((ViewGroup) parent).removeView(customView);
                }
            }

            // 更新CustomView
            tab.setCustomView(mPagerAdapter.getTabItemView(i));
        }

        // 需加上以下代码,不然会出现更新Tab角标后,选中的Tab字体颜色不是选中状态的颜色
        mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).getCustomView().setSelected(true);
    }

    @Override
    public void onClick(View v) {
        mBadgeCountList.set(1, count++);
        setUpTabBadge();
    }
}
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

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

/**
 * 类名:
 * 类描述:实现TabLayout + viewpager + fragment 并TabLayout标题右上角有数字标记
 * 创建人:fly
 * 创建日期: 2017/2/2.
 * 版本:V1.0
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private List<String> mPageTitleList = new ArrayList<String>();
    private List<Fragment> mFragmentList = new ArrayList<Fragment>();
    private List<Integer> mBadgeCountList = new ArrayList<Integer>();
    private List<BadgeView> mBadgeViews;

    private SimpleFragmentPagerAdapter mPagerAdapter;
    private TabLayout mTabLayout;
    private ViewPager mViewPager;


    private int count = 0;

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

        initFragments();
        initView();
    }

    private void initFragments() {
        // 初始化标题
        mPageTitleList.add("Tab1");
        mPageTitleList.add("Tab2");
        mPageTitleList.add("Tab3");

        // 初始化标题右上角的数字
        mBadgeCountList.add(6);
        mBadgeCountList.add(count++);
        mBadgeCountList.add(166);

        // 初始化对应的fragment
        for (int i = 0; i < mPageTitleList.size(); i++) {
            mFragmentList.add(PageFragment.getInstance(mPageTitleList.get(i)));
        }
    }

    private void initView() {
        findViewById(R.id.btn_add_badge).setOnClickListener(this);

        mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        mPagerAdapter = new SimpleFragmentPagerAdapter(this, getSupportFragmentManager(),
                        mFragmentList, mPageTitleList, mBadgeCountList);
        mViewPager.setAdapter(mPagerAdapter);
        mTabLayout.setupWithViewPager(mViewPager);

//        initBadgeViews();
        setUpTabBadge();
    }

    /**初始化标题右上角标记*/
//    private void initBadgeViews() {
//        if (mBadgeViews == null) {
//            mBadgeViews = new ArrayList<>();
//            for (int i = 0; i < mFragmentList.size(); i++) {
//                BadgeView tmp = new BadgeView(this);
//                tmp.setBadgeMargin(0, 6, 10, 0);
//                tmp.setTextSize(10);
//                mBadgeViews.add(tmp);
//            }
//        }
//    }

    /**
     * 设置Tablayout上的标题的角标
     */
    private void setUpTabBadge() {
        // 1. 最简单
//        for (int i = 0; i < mFragmentList.size(); i++) {
//            mBadgeViews.get(i).setTargetView(((ViewGroup) mTabLayout.getChildAt(0)).getChildAt(i));
//            mBadgeViews.get(i).setText(formatBadgeNumber(mBadgeCountList.get(i)));
//        }

        // 2. 最实用
        for (int i = 0; i < mFragmentList.size(); i++) {
            TabLayout.Tab tab = mTabLayout.getTabAt(i);

            // 更新Badge前,先remove原来的customView,否则Badge无法更新
            View customView = tab.getCustomView();
            if (customView != null) {
                ViewParent parent = customView.getParent();
                if (parent != null) {
                    ((ViewGroup) parent).removeView(customView);
                }
            }

            // 更新CustomView
            tab.setCustomView(mPagerAdapter.getTabItemView(i));
        }

        // 需加上以下代码,不然会出现更新Tab角标后,选中的Tab字体颜色不是选中状态的颜色
        mTabLayout.getTabAt(mTabLayout.getSelectedTabPosition()).getCustomView().setSelected(true);
    }

    @Override
    public void onClick(View v) {
        mBadgeCountList.set(1, count++);
        setUpTabBadge();
    }
}

源码下载

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值