布局共三部分:top,bottom,中间。

top.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:background="@drawable/title_bar"android:layout_width="match_parent"android:layout_height="45dp"android:orientation="vertical"android:gravity="center_vertical"><TextView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="微信"android:textColor="#ffffff"android:textSize="20sp"android:layout_gravity="center"android:textStyle="bold"/>
</LinearLayout>

在TextView(组件)里,layout_gravity和gravity的区别:gravity指“微信”(组件里的东西)在本组件中的位置,layout_gravity指本组件在父类中的位置。
在LinearLayout(布局)里,gravity指组件在本布局中的位置。
我不是很熟悉的属性:对LinearLayout,background;对TextView,textColor(#ffffff白色,#000000黑色),textStyle。

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="55dp"android:background="@drawable/bottom_bar"android:orientation="horizontal"><LinearLayout android:id="@+id/id_tab_weixin"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:gravity="center"><ImageButton android:id="@+id/id_tab_weixin_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/tab_weixin_pressed"android:background="#00000000"android:clickable="false"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="微信"android:textColor="#ffffff"/></LinearLayout><LinearLayout android:id="@+id/id_tab_frd"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:gravity="center"><ImageButton android:id="@+id/id_tab_frd_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/tab_find_frd_normal"android:background="#00000000"android:clickable="false"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="朋友"android:textColor="#ffffff"/></LinearLayout><LinearLayout android:id="@+id/id_tab_address"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:gravity="center"><ImageButton android:id="@+id/id_tab_address_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/tab_address_normal"android:background="#00000000"android:clickable="false"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="通讯录"android:textColor="#ffffff"/></LinearLayout><LinearLayout android:id="@+id/id_tab_settings"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"android:gravity="center"><ImageButton android:id="@+id/id_tab_settings_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/tab_settings_normal"android:background="#00000000"android:clickable="false"/><TextView
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="设置"android:textColor="#ffffff"/></LinearLayout>
</LinearLayout>

一个横向的LinearLayout包括4个纵向的LinearLayout,每个纵向的LinearLayout有2个组件,ImageButton和TextView。
ImageButton的src和background的区别:src在表面,background在底下那层。当src的图片没有占满整个空间时,background就起作用了。#00000000,前两个0表示完全透明,所以其实后面6个0写成什么都行。因此,背景透明,就和LinearLayout的背景一样。
当需要几个组件平均占领一行时,就把对应的width或height写成0dp,weight写成1。

activity_main.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="match_parent"android:orientation="vertical"><include layout="@layout/top"/><android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></android.support.v4.view.ViewPager><include layout="@layout/bottom"/>
</LinearLayout>

include
ViewPager

tab01.xml(tab02.xml,tab03.xml,tab04.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="match_parent"android:orientation="vertical"><TextView
        android:layout_width="match_parent"android:layout_height="match_parent"android:text="This is Weixin Tab"android:textSize="30sp"android:textStyle="bold"android:gravity="center"/>
</LinearLayout>

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {private ViewPager mViewPager;private PagerAdapter mAdapter;private List<View> mViews = new ArrayList<View>();private LinearLayout mTabWeixin;private LinearLayout mTabFrd;private LinearLayout mTabAddress;private LinearLayout mTabSettings;private ImageButton mWeixinImg;private ImageButton mFrdImg;private ImageButton mAddressImg;private ImageButton mSettingsImg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);//不显示标题栏setContentView(R.layout.activity_main);initView();initEvent();}private void initView() {mViewPager = (ViewPager) findViewById(R.id.id_viewpager);mTabWeixin = (LinearLayout) findViewById(R.id.id_tab_weixin);mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd);mTabAddress = (LinearLayout) findViewById(R.id.id_tab_address);mTabSettings = (LinearLayout) findViewById(R.id.id_tab_settings);mWeixinImg = (ImageButton) findViewById(R.id.id_tab_weixin_img);mFrdImg = (ImageButton) findViewById(R.id.id_tab_frd_img);mAddressImg = (ImageButton) findViewById(R.id.id_tab_address_img);mSettingsImg = (ImageButton) findViewById(R.id.id_tab_settings_img);LayoutInflater mInflater = LayoutInflater.from(this);View tab01 = mInflater.inflate(R.layout.tab01, null);View tab02 = mInflater.inflate(R.layout.tab02, null);View tab03 = mInflater.inflate(R.layout.tab03, null);View tab04 = mInflater.inflate(R.layout.tab04, null);mViews.add(tab01);mViews.add(tab02);mViews.add(tab03);mViews.add(tab04);mAdapter = new PagerAdapter() {@Overridepublic int getCount() {return mViews.size();}@Overridepublic Object instantiateItem(ViewGroup container, int position) {View view = mViews.get(position);container.addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mViews.get(position));}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}};mViewPager.setAdapter(mAdapter);}private void initEvent() {mTabWeixin.setOnClickListener(this);mTabFrd.setOnClickListener(this);mTabAddress.setOnClickListener(this);mTabSettings.setOnClickListener(this);mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {int currentItem = mViewPager.getCurrentItem();resetImg();switch (currentItem) {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;}}@Overridepublic void onPageSelected(int position) {}@Overridepublic void onPageScrollStateChanged(int state) {}});}@Overridepublic void onClick(View view) {resetImg();switch (view.getId()) {case R.id.id_tab_weixin:mViewPager.setCurrentItem(0);mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);break;case R.id.id_tab_frd:mViewPager.setCurrentItem(1);mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);break;case R.id.id_tab_address:mViewPager.setCurrentItem(2);mAddressImg.setImageResource(R.drawable.tab_address_pressed);break;case R.id.id_tab_settings:mViewPager.setCurrentItem(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);}
}
  1. ViewPager的初始化
    一层一层封装。把数组(元素为View类型)装到PagerAdapter适配器中,把适配器装到ViewPager里。
  2. 两个功能
    1.点击下面的四个图标,图标点亮,页面切换。
    四个LinearLayout监听事件。(注:多个监听事件可以用implement接口View.OnClickListener,在class里重写。)
    2.左右滑动页面,同时图标点亮。
    设置页面改变监听事件(ViewPager)。

最后,还有一个bug,就是点四个ImageButton没反应。改正方法为在ImageButton里增加属性clickable设为false。

本文参考慕课网android课程–多种多样的App主界面Tab实现方法

用ViewPager实现微信tab切换相关推荐

  1. 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 先上效果图: 这里主要用到了swiper组件和三目运算,直接上代码, 样式只有三个class,简单粗暴 ...

  2. php 实现tab切换_微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码)...

    本篇文章给大家带来的内容是关于微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 实现的效果: js: Pa ...

  3. 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab

    解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...

  4. 微信小程序基于swiper组件的tab切换

    代码地址如下: http://www.demodashi.com/demo/14010.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  5. navtab触底 小程序_微信小程序TAB切换效果

    微信小程序tab切换效果 话不多说,先上效果图 主要是让在一个WXML上面显示2个页面,用来分页展示东西. 直接上代码了: 首先是wxml {{item}} A页 B页 然后是wxcss样式代码 .t ...

  6. 微信小程序利用swiper+scroll-view实现Tab切换

    微信小程序利用swiper+scroll-view实现Tab切换 先放一张效果图 需要实现的功能逻辑: 1.当用户点击tab的时候,tab样式发生改变,并且下方对应的展示内容也发生改变. 2.当用户滑 ...

  7. 微信小程序中的Tab切换

    微信小程序中的Tab切换 使用步骤 使用步骤 代码如下(示例): 定义一个状态status data: {status: 0,}, 代码如下(示例): 在点击切换时利用status来切换根据index ...

  8. 微信小程序使用Echarts绘制K线图与双曲线图以及实现tab切换

    在微信小程序中使用Echarts需要下载相应的文件,可在这下载ec-canvas,该github里也有很多很好的例子,可自行调试学习. 本例子的目录结构: 微信小程序使用Echarts的步骤 在需要引 ...

  9. 微信小程序顶部tab切换以及滑动

    效果图图片如下 实现代码xml中 <view class="swiper_tab_view"><scroll-view scroll-x='true' scrol ...

  10. 微信小程序 tab切换

    设置背景颜色就直接在page里设置    page {background-color: rgb(242, 242, 242);} tab切换: navigator 页面链接 传参的格式为url=&q ...

最新文章

  1. python django windows_Python+Django在windows下的开发环境配置图解
  2. 初中生自学python能学成吗-Python进入初中生学习课堂?风变编程助你从后浪中成功突围...
  3. RecyclerView加载不同view实现效果--IT蓝豹
  4. 来自未来,2022 年的前端人都在做什么?
  5. Android之封装好的异步网络请求框架
  6. 系统学Android从零开始,详细的Android学习指南
  7. select 1 from 浅析
  8. 【JAVA 第三章 流程控制语句】课后习题 编写判断从键盘输入的字符串是否为回文
  9. matlab混合编程 mex,求教:matlab混合编程关于mex内自定义函数的输出
  10. [ SHELL编程 ] 远程服务器传输文件
  11. 虚拟主机和云服务器有什么区别,我们应该如何选择?
  12. 指数型组织:未来组织发展的必然趋势
  13. hdu5773 LIS+贪心
  14. python笔记三之面向对象(继承,封装,多态)
  15. 【CodeWars】Path Finder #2: shortest path
  16. CDO玩“跨界”,数据驱动有戏了
  17. 李峋同款 爱心动态代码 步骤教程,可自定义修改自己喜爱照片背景(附代码)
  18. php redis setex如何获取,php-redis中文参考手册_Ping_echo_set_get_setex_psetex_...
  19. JS逆向 2021-8-16 网易云音乐 params、encSecKey参数
  20. linux设置spi时钟频率,Linux下S3C2416的SPI设置问题,CLK和MOSI都没有输出,求助

热门文章

  1. C# sqlsugar依赖引用报错的问题解决
  2. RS485通讯协议的应用
  3. PLC对步进电机的快速精确定位控制
  4. 中英文论文写作指导第三部分(实验、材料和方法部分)
  5. 草图大师插件常用插件_20个草图插件可增强您的生产力
  6. EWSA1.50.0.298栈溢出错误
  7. 黑客工具软件大全100套
  8. 计算机如何保护数据,保护数据-避免丢失
  9. 2014年 教师全员远程培训挂机 教师远程全员培训挂机 教师继续教育挂机 挂机软件 全国通用版...
  10. 蓝墨云班课计算机网络答案,基于蓝墨云班课的 《计算机网络与应用》实验课 教学改革探究...