用ViewPager实现微信tab切换
来源:互联网 发布:中国空军 知乎 编辑:程序博客网 时间:2024/04/30 13:29
布局共三部分: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; @Override protected 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() { @Override public int getCount() { return mViews.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { View view = mViews.get(position); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mViews.get(position)); } @Override public 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() { @Override public 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; } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } @Override public 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); }}
- ViewPager的初始化
一层一层封装。把数组(元素为View类型)装到PagerAdapter适配器中,把适配器装到ViewPager里。 - 两个功能
1.点击下面的四个图标,图标点亮,页面切换。
四个LinearLayout监听事件。(注:多个监听事件可以用implement接口View.OnClickListener,在class里重写。)
2.左右滑动页面,同时图标点亮。
设置页面改变监听事件(ViewPager)。
最后,还有一个bug,就是点四个ImageButton没反应。改正方法为在ImageButton里增加属性clickable设为false。
本文参考慕课网android课程–多种多样的App主界面Tab实现方法
- 用ViewPager实现微信tab切换
- 用Fragment实现微信Tab切换
- FragmentPagerAdapter+ViewPager实现Tab切换效果
- ViewPager实现简单Tab切换效果
- 实现滚动tab切换fragment + viewpager
- Android ViewPager 仿照微信Tab
- Android底部Tab+ViewPager(微信界面)
- tab微信主页切换1
- ActionBar + ViewPager实现左右滑动切换Tab页效果
- 使用Fragment+ViewPager,仿微信实现多页Tab切换
- 通过Fragment + Viewpager+Gridview实现Android Tab切换菜单
- TabPagerIndicator和viewpager实现tab的切换(慕课网笔记)
- ViewPager、Fragment、RadioButton实现顶部切换Tab页面
- Tablayout+viewpager+fragment实现tab导航以及滑动切换
- 自定义tab,viewpager实现仿tablayout切换效果
- tab头部滑动切换,TabLayout和ViewPager实现
- viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果)
- Android fragment+viewpager 切换Tab
- 使用ngrok让微信公众平台通过80端口访问本机
- 《Windows核心编程》之”内存体系结构“
- VMWare三种网络模式图解
- 洛谷P1141 01迷宫
- [LeetCode] 66. Plus One
- 用ViewPager实现微信tab切换
- java按一定数量补0,随机数获取
- 一些经常用的网址
- Java学习笔记--类加载机制
- java读取遍历excel
- 【C#新手的白痴疑难】2016.7.28
- ios 打印
- Android:控件WebView显示网页
- Delphi 常用API函数 存档