`
hzy3774
  • 浏览: 992909 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Android使用TabLayout与ViewPager结合以及TabItem自定义

 
阅读更多

使用android的design支持包中的android.support.design.widget.TabLayout结合ViewPager/Fragment来写多Tab的应用,只需要一句代码,就可以完成Tab与ViewPager切换的联动,免除很多麻烦。

mTabLayout.setupWithViewPager(mViewPager);

 

先写个主布局文件,只需要加入ViewPager和TabLayout即可,Tab可在ViewPager上方,也可在下方,看各自需求:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="true"
    android:orientation="vertical">

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

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="@dimen/tabbar_def_height"
        app:tabBackground="@color/color_f7f7f7"
        app:tabIndicatorHeight="@dimen/margin_0"
        app:tabMode="fixed" />
</LinearLayout>

 

在java代码中,ViewPager按常规设置个PagerAdapter就有效果了,但需要和Tab关联,需要加上setupWithViewPager()的调用:

 

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

...

mViewPager.setAdapter(pagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
 

 

如此之后发现,ViewPager可以正常使用,TabLayout的标题却没有显示,这时,如果TabLayout上只需要显示文字标题,就很容易了,在我们自定义的PagerAdapter里重写getPageTitle方法,TabLayout与ViewPager结合以后它会从这里读取内容去显示:

 

public class MainPagerAdapter extends FragmentPagerAdapter {

    ...    

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

 

Tab的标题显示出来了,联动也可以了,样式的话,在TabLayout控件的属性里设置就行了。什么?标题光有文字还不够?那也可以,只想在上方加个图标,弄个仿微信样式的话也不需要自定义布局文件,主要有两种办法,第一是在setupWithViewPager之后,把循环给单个Tab设置icon:

 

mTabLayout.setupWithViewPager(mViewPager);

mTabLayout.getTabAt(0).setIcon(R.mipmap.ic_launcher);
mTabLayout.getTabAt(1).setIcon(R.mipmap.ic_launcher);
mTabLayout.getTabAt(2).setIcon(R.mipmap.ic_launcher);

 

另一种办法可以直接把Tab布局写死,使用控件android.support.design.widget.TabItem即可,形如:

 

<android.support.design.widget.TabLayout
        android:id="@+id/tablayout"
        android:background="@color/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabItem
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Android"/>

        <android.support.design.widget.TabItem
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:icon="@mipmap/ic_launcher"/>
    </android.support.design.widget.TabLayout>
 

 

如此操作,效果也是可以给TabItem设置一个图标和一个文字标题。当然,如果想要定制更加复杂的TabLayout,同样是先获取Tab,给它设置自定义View即可:

 

mTabLayout.getTabAt(i).setCustomView(view);
 

 

自定义的完整代码如下:

首先我自定义了一个结构TabItemInfo,用于方便用代码添加Tab和ViewPager的Item,一看便明了:

 

public class TabItemInfo {
    private Class<? extends Fragment> fragmentClass;
    private int nameResource;
    private int iconResource;

    public TabItemInfo(Class<? extends Fragment> fragmentClass, @StringRes int nameResource,
                       @DrawableRes int iconResource) {
        this.fragmentClass = fragmentClass;
        this.nameResource = nameResource;
        this.iconResource = iconResource;
    }

    public Class<? extends Fragment> getFragmentClass() {
        return fragmentClass;
    }

    public int getNameResource() {
        return nameResource;
    }

    public int getIconResource() {
        return iconResource;
    }
}
 

 

PagerAdapter,无奇特之处,只是多加了一个根据position来获取自定义TabView的方法,以便在Activity里设置TabLayout的时候可以方便获取:

 

public class MainPagerAdapter extends FragmentPagerAdapter {

    private Context mContext;
    private List<TabItemInfo> mTabItems;

    public MainPagerAdapter(Context context, FragmentManager fm, List<TabItemInfo> tabItems) {
        super(fm);
        mContext = context;
        mTabItems = tabItems;
    }

    @Override
    public Fragment getItem(int position) {
        try {
            return mTabItems.get(position).getFragmentClass().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

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

    public View getTabView(int position) {
        TabItemInfo itemInfo = mTabItems.get(position);
        View view = LayoutInflater.from(mContext).inflate(R.layout.custom_view_tab_item, null);
        TextView tv = (TextView) view.findViewById(R.id.tab_text);
        tv.setText(itemInfo.getNameResource());
        ImageView img = (ImageView) view.findViewById(R.id.tab_image);
        img.setImageResource(itemInfo.getIconResource());
        return view;
    }
}
 

 

 在Activity里设置ViewPager和TabLayout:

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

List<TabItemInfo> tabItems = new LinkedList<>();
tabItems.add(new TabItemInfo(CashLoanFragment.class, R.string.cash_loan, R.drawable.apply_tab_icon_drawable));
tabItems.add(new TabItemInfo(GoodsLoanFragment.class, R.string.apply_credit, R.drawable.phone_tab_icon_drawable));
tabItems.add(new TabItemInfo(UserCenterNewFragment.class, R.string.user_center, R.drawable.my_tab_icon_drawable));

MainPagerAdapter pagerAdapter = new MainPagerAdapter(this, getSupportFragmentManager(), tabItems);
mViewPager.setAdapter(pagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
    TabLayout.Tab tab = mTabLayout.getTabAt(i);
    if (tab != null) {
        tab.setCustomView(pagerAdapter.getTabView(i));
    }
}

 

这样之后,自定义的TabItemView就设置好了,注意,自定义的布局里,background,textColor之类的,可以用selector指定好选中状态和非选中状态的不同资源,这样TabLayout左右切换的时候,才会有效果。

 

分享到:
评论

相关推荐

    TabLayout+TabItem+ViewPager+Fragment实现早期微信屏幕滑动效果

    在Android应用开发中,创建一个类似早期微信的屏幕滑动效果是常见的需求,这涉及到UI组件的组合使用,包括TabLayout、TabItem、ViewPager以及Fragment。这个效果允许用户通过水平滑动来切换不同的内容区域,通常用于...

    Android中TabLayout添加小红点的示例代码

    6. Android中TabLayout与ViewPager的关联使用 7. Android中addOnTabSelectedListener方法的使用 8. Android中findViewById方法的使用 在本篇文章中,我们分享了Android中TabLayout添加小红点的示例代码,希望对您...

    TabLayout标题文字不显示的解决操作

    此外,TabLayout还具有许多其他的使用技巧和问题解决方法,如TabLayout的Indicator样式、TabLayout与ViewPager的结合使用、TabLayout的自定义样式等等。 TabLayout标题文字不显示的解决操作非常重要,对于Android...

    TabLayout修改下划线

    在Android开发中,`TabLayout`是谷歌...总的来说,修改`TabLayout`的下划线涉及到Android的样式系统、编程动态操作以及可能的自定义视图。通过理解这些知识点,开发者可以根据具体需求创造出独具特色的`TabLayout`。

    Android Tablayout 的Indicator 长度和样式的修改

    总之,Android TabLayout的Indicator修改是一个灵活的过程,可以通过自定义布局、设置属性或者扩展TabLayout类来满足各种视觉效果。在设计时,应充分考虑用户体验,确保Indicator的可见性和可操作性,使其与应用的...

    TabLayout的使用

    **TabLayout**是Android开发...通过运行这个项目,你可以理解TabLayout是如何与ViewPager协作来展示和切换页面的,以及如何自定义Tab的内容和样式。这是一个很好的起点,你可以在此基础上根据实际需求进行扩展和优化。

    fragment+viewpager+tablayout实现选项卡,底部选项卡,禁止滑动切换,实现了禁止懒加载判断

    fragment+viewpager+tablayout实现选项卡,底部选项卡,禁止滑动切换,实现了禁止懒加载判断,如果想要滑动的话把自定义viewpager 换成原包的viewpager就可以,代码中判断了fragment的真是过程,亲测好用,直接可以...

    基于TabLayout中的Tab间隔设置方法(实例讲解)

    TabLayout是Android设计支持库中的一种布局控件,通常与ViewPager搭配使用,用于实现多页签切换效果。然而,TabLayout的使用中存在一些不足之处,例如Tab之间的间隔设置问题。今天,我们将探索基于TabLayout中的Tab...

    自定义TabBar

    在Android中,我们通常使用`TabLayout`与`ViewPager`结合,通过`TabLayout.Tab`对象来定制Tab。以下是一些步骤: 1. 在布局XML文件中,添加`TabLayout`和`ViewPager`组件。 2. 创建一个`PagerAdapter`子类,用来...

    android小插件tab标签大合集_精美简约插件源码.zip

    1. **Android Tab布局**:在Android中,Tab标签通常与ViewPager结合使用,创建一个可以左右滑动的多页面视图。TabLayout是Android Support Library中的一个组件,它提供了创建Tab标签的功能。通过添加TabItem来设置...

    Aandroid Tanlayout+ViewPager+Fragment

    实现了自定义Tablayout+Fragment+ViewPager的切换、处理了Tablayout的监听(当选中Tabitem时可实现选中字体变大,加粗,透明度等及启动Activity时默认第一个Tabitem字体加粗、显示icon等)

    fragment inside fragment 实现顶部和底部tab

    在Android开发中,`Fragment` 是一个非常重要的组件,它允许开发者在Activity中添加和管理多个界面...通过使用`TabLayout`和`ViewPager`,以及自定义Tab的视图,可以创建出功能强大且用户体验良好的多视图切换应用。

    Android实现底部切换标签

    最后,在主Activity中,我们需要设置一个`ViewPager`来展示Fragment,并使用`TabLayout`与`ViewPager`配合,实现底部标签的切换效果。`TabLayout`将自动根据`ViewPager`中的页面数量和`TabPagerAdapter`提供的标题来...

    XTabLayoutDemo

    在Android应用开发中,UI设计是至关重要的一个环节,而TabLayout作为一种常见的界面元素,用于展示多个可切换的页面,通常与ViewPager结合使用。本文将深入探讨如何在Android项目中实现一个可自定义字体大小和指示器...

    Android应用源码之Tab控件使用的最简纯净Demo.rar

    3. **ViewPager**:为了实现平滑的左右滑动切换Tab,通常会结合使用ViewPager。ViewPager允许用户左右滑动查看页面,而不需要手动点击Tab。它与Fragments配合良好,可以自动管理Fragment的生命周期和页面的滑动效果...

    Android_布局详解【图文】

    选项卡布局常与ViewPager结合使用,用于创建滑动的页面,每个页面对应一个选项卡。例如: ```xml &lt;androidx.tabs.TabLayout ...&gt; &lt;com.google.android.material.tabs.TabItem ... /&gt; &lt;/androidx.tabs....

    Android高级应用源码-仿 网易新闻客户端 滑动导航.zip

    - **TabLayout**:Google Material Design 提供的组件,用于创建底部导航栏,可以与ViewPager配合使用,实现滑动时Tab的高亮切换效果。 - **TabItem**:表示TabLayout中的每一个Tab,可以通过XML或者代码动态添加...

    安卓开发-各种侧滑界面的实现(圆点指示_标签指示).zip

    在Android中,可以使用`TabLayout`配合`ViewPager`实现这一功能。`TabLayout`负责展示标签,`ViewPager`处理页面的滑动。为了自定义标签的样式,我们可以通过设置`TabLayout`的`tabMode`、`tabGravity`属性,以及为...

Global site tag (gtag.js) - Google Analytics