使用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左右切换的时候,才会有效果。
相关推荐
在Android应用开发中,创建一个类似早期微信的屏幕滑动效果是常见的需求,这涉及到UI组件的组合使用,包括TabLayout、TabItem、ViewPager以及Fragment。这个效果允许用户通过水平滑动来切换不同的内容区域,通常用于...
6. Android中TabLayout与ViewPager的关联使用 7. Android中addOnTabSelectedListener方法的使用 8. Android中findViewById方法的使用 在本篇文章中,我们分享了Android中TabLayout添加小红点的示例代码,希望对您...
此外,TabLayout还具有许多其他的使用技巧和问题解决方法,如TabLayout的Indicator样式、TabLayout与ViewPager的结合使用、TabLayout的自定义样式等等。 TabLayout标题文字不显示的解决操作非常重要,对于Android...
在Android开发中,`TabLayout`是谷歌...总的来说,修改`TabLayout`的下划线涉及到Android的样式系统、编程动态操作以及可能的自定义视图。通过理解这些知识点,开发者可以根据具体需求创造出独具特色的`TabLayout`。
总之,Android TabLayout的Indicator修改是一个灵活的过程,可以通过自定义布局、设置属性或者扩展TabLayout类来满足各种视觉效果。在设计时,应充分考虑用户体验,确保Indicator的可见性和可操作性,使其与应用的...
**TabLayout**是Android开发...通过运行这个项目,你可以理解TabLayout是如何与ViewPager协作来展示和切换页面的,以及如何自定义Tab的内容和样式。这是一个很好的起点,你可以在此基础上根据实际需求进行扩展和优化。
fragment+viewpager+tablayout实现选项卡,底部选项卡,禁止滑动切换,实现了禁止懒加载判断,如果想要滑动的话把自定义viewpager 换成原包的viewpager就可以,代码中判断了fragment的真是过程,亲测好用,直接可以...
TabLayout是Android设计支持库中的一种布局控件,通常与ViewPager搭配使用,用于实现多页签切换效果。然而,TabLayout的使用中存在一些不足之处,例如Tab之间的间隔设置问题。今天,我们将探索基于TabLayout中的Tab...
在Android中,我们通常使用`TabLayout`与`ViewPager`结合,通过`TabLayout.Tab`对象来定制Tab。以下是一些步骤: 1. 在布局XML文件中,添加`TabLayout`和`ViewPager`组件。 2. 创建一个`PagerAdapter`子类,用来...
1. **Android Tab布局**:在Android中,Tab标签通常与ViewPager结合使用,创建一个可以左右滑动的多页面视图。TabLayout是Android Support Library中的一个组件,它提供了创建Tab标签的功能。通过添加TabItem来设置...
实现了自定义Tablayout+Fragment+ViewPager的切换、处理了Tablayout的监听(当选中Tabitem时可实现选中字体变大,加粗,透明度等及启动Activity时默认第一个Tabitem字体加粗、显示icon等)
在Android开发中,`Fragment` 是一个非常重要的组件,它允许开发者在Activity中添加和管理多个界面...通过使用`TabLayout`和`ViewPager`,以及自定义Tab的视图,可以创建出功能强大且用户体验良好的多视图切换应用。
最后,在主Activity中,我们需要设置一个`ViewPager`来展示Fragment,并使用`TabLayout`与`ViewPager`配合,实现底部标签的切换效果。`TabLayout`将自动根据`ViewPager`中的页面数量和`TabPagerAdapter`提供的标题来...
在Android应用开发中,UI设计是至关重要的一个环节,而TabLayout作为一种常见的界面元素,用于展示多个可切换的页面,通常与ViewPager结合使用。本文将深入探讨如何在Android项目中实现一个可自定义字体大小和指示器...
3. **ViewPager**:为了实现平滑的左右滑动切换Tab,通常会结合使用ViewPager。ViewPager允许用户左右滑动查看页面,而不需要手动点击Tab。它与Fragments配合良好,可以自动管理Fragment的生命周期和页面的滑动效果...
选项卡布局常与ViewPager结合使用,用于创建滑动的页面,每个页面对应一个选项卡。例如: ```xml <androidx.tabs.TabLayout ...> <com.google.android.material.tabs.TabItem ... /> </androidx.tabs....
- **TabLayout**:Google Material Design 提供的组件,用于创建底部导航栏,可以与ViewPager配合使用,实现滑动时Tab的高亮切换效果。 - **TabItem**:表示TabLayout中的每一个Tab,可以通过XML或者代码动态添加...
在Android中,可以使用`TabLayout`配合`ViewPager`实现这一功能。`TabLayout`负责展示标签,`ViewPager`处理页面的滑动。为了自定义标签的样式,我们可以通过设置`TabLayout`的`tabMode`、`tabGravity`属性,以及为...