三种实现Android主界面Tab的方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了三种实现Android主界面Tab的方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含32258字,纯文字阅读大概需要47分钟。
内容图文
![三种实现Android主界面Tab的方式](/upload/InfoBanner/zyjiaocheng/1173/6b1716df74e84d3297185f73db5abd61.jpg)
在平时的Android开发中,我们经常会使用Tab来进行主界面的布局。由于手机屏幕尺寸的限制,合理使用Tab可以极大的利用屏幕资源,给用户带来良好的体验。学会Tab的使用方法已经成为学习Android开发必不可少的技能了。我们经常使用的微信、QQ就是使用Tab的方式进行主界面的布局的。
下面我们通过三种方式实现旧版的微信以演示Tab的使用方式。
最终效果:
第一种:单纯使用ViewPager
MainActivity.java
public
class MainActivity extends Activity implements OnClickListener {
//声明ViewPagerprivate ViewPager mViewpager;
//声明四个Tabprivate LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;
//声明四个ImageButtonprivate ImageButton mWeixinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingImg;
//声明ViewPager的适配器private PagerAdapter mAdpater;
//用于装载四个Tab的Listprivate List<View> mTabs = new ArrayList<View>();
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉TitleBar requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initViews();//初始化控件
initDatas();//初始化数据
initEvents();//初始化事件
}
privatevoid initEvents() {
//设置四个Tab的点击事件
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
//添加ViewPager的切换Tab的监听事件
mViewpager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
publicvoid onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
publicvoid onPageSelected(int position) {
//获取ViewPager的当前Tabint currentItem = mViewpager.getCurrentItem();
//将所以的ImageButton设置成灰色 resetImgs();
//将当前Tab对应的ImageButton设置成绿色switch (currentItem) {
case 0:
mWeixinImg.setImageResource(R.mipmap.tab_weixin_pressed);
break;
case 1:
mFrdImg.setImageResource(R.mipmap.tab_find_frd_pressed);
break;
case 2:
mAddressImg.setImageResource(R.mipmap.tab_address_pressed);
break;
case 3:
mSettingImg.setImageResource(R.mipmap.tab_settings_pressed);
break;
}
}
@Override
publicvoid onPageScrollStateChanged(int state) {
}
});
}
privatevoid initDatas() {
//初始化ViewPager的适配器
mAdpater = new PagerAdapter() {
@Override
publicint getCount() {
return mTabs.size();
}
@Override
publicboolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = mTabs.get(position);
container.addView(view);
return view;
}
@Override
publicvoid destroyItem(ViewGroup container, int position, Object object) { container.removeView(mTabs.get(position));
}
};
//设置ViewPager的适配器 mViewpager.setAdapter(mAdpater);
}
//初始化控件privatevoid initViews() {
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);
mTabSetting = (LinearLayout) findViewById(R.id.id_tab_setting);
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);
mSettingImg = (ImageButton) findViewById(R.id.id_tab_setting_img);
//获取到四个Tab
LayoutInflater inflater = LayoutInflater.from(this);
View tab1 = inflater.inflate(R.layout.tab1, null);
View tab2 = inflater.inflate(R.layout.tab2, null);
View tab3 = inflater.inflate(R.layout.tab3, null);
View tab4 = inflater.inflate(R.layout.tab4, null);
//将四个Tab添加到集合中 mTabs.add(tab1);
mTabs.add(tab2);
mTabs.add(tab3);
mTabs.add(tab4);
}
@Override
publicvoid onClick(View v) {
//先将四个ImageButton都设置成灰色 resetImgs();
switch (v.getId()) {
case R.id.id_tab_weixin:
//设置viewPager的当前Tab
mViewpager.setCurrentItem(0);
//将当前Tab对应的ImageButton设置成绿色 mWeixinImg.setImageResource(R.mipmap.tab_weixin_pressed);
break;
case R.id.id_tab_frd:
mViewpager.setCurrentItem(1);
mFrdImg.setImageResource(R.mipmap.tab_find_frd_pressed);
break;
case R.id.id_tab_address:
mViewpager.setCurrentItem(2);
mAddressImg.setImageResource(R.mipmap.tab_address_pressed);
break;
case R.id.id_tab_setting:
mViewpager.setCurrentItem(3);
mSettingImg.setImageResource(R.mipmap.tab_settings_pressed);
break;
}
}
//将四个ImageButton设置成灰色privatevoid resetImgs () {
mWeixinImg.setImageResource(R.mipmap.tab_weixin_normal);
mFrdImg.setImageResource(R.mipmap.tab_find_frd_normal);
mAddressImg.setImageResource(R.mipmap.tab_address_normal);
mSettingImg.setImageResource(R.mipmap.tab_settings_normal);
}
}
顶部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:background ="@android:drawable/title_bar" android:gravity ="center" android:layout_width ="match_parent" android:layout_height ="45dp" > < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="微信" android:textColor ="#ffffff" android:textSize ="20sp" android:textStyle ="bold" /> </ LinearLayout >
四个Tab对应页面的布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Weixin Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Friend Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Address Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Setting Tab!" /> </ LinearLayout >
底部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? 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:gravity ="center" android:background ="@color/material_blue_grey_800" android:orientation ="horizontal" > < LinearLayout android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:id ="@+id/id_tab_weixin" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_weixin_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_weixin_pressed" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="微信" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_frd" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_frd_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_find_frd_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="朋友" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_address" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_address_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_address_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="通讯录" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_setting" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_setting_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_settings_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="设置" /> </ LinearLayout > </ LinearLayout >
主布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < 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 >
完整源码 : 点击下载
单纯使用ViewPager的方式可以实现左右滑动切换页面和点击Tab切换页面的效果。但是大家发现,这种方式需要在Activity完成所有的代码实现,包括初始化Tab及其对应页面的初始化控件、数据、事件及业务逻辑的处理。这样会使得Activity看起来非常臃肿,进而造成代码的可读性和可维护性变得极差。
谷歌在Android 3.0时推出了Fragment。可以分别使用Fragment来管理每个Tab对应的页面的布局及功能的实现。然后将Fragment与Android关联,这样Android只需要管理Fragment就行了,起到了调度器的作用,不再关心每个Fragment里的内容及功能实现是什么。这样就极大的解放了Activity,使代码变得简单、易读。
下面我们通过使用Fragment的方式来实现Tab。
第二种:单纯使用Fragment
MainActivity.java
public
class MainActivity extends FragmentActivity implements OnClickListener {
//声明四个Tab的布局文件private LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;
//声明四个Tab的ImageButtonprivate ImageButton mWeixinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingImg;
//声明四个Tab分别对应的Fragmentprivate Fragment mFragWeinxin;
private Fragment mFragFrd;
private Fragment mFragAddress;
private Fragment mFragSetting;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initViews();//初始化控件
initEvents();//初始化事件
selectTab(0);//默认选中第一个Tab }
privatevoid initEvents() {
//初始化四个Tab的点击事件
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
}
privatevoid initViews() {
//初始化四个Tab的布局文件
mTabWeixin = (LinearLayout) findViewById(R.id.id_tab_weixin);
mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd);
mTabAddress = (LinearLayout) findViewById(R.id.id_tab_address);
mTabSetting = (LinearLayout) findViewById(R.id.id_tab_setting);
//初始化四个ImageButton
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);
mSettingImg = (ImageButton) findViewById(R.id.id_tab_setting_img);
}
//处理Tab的点击事件 @Override
publicvoid onClick(View v) {
//先将四个ImageButton置为灰色 resetImgs();
switch (v.getId()) {
case R.id.id_tab_weixin:
selectTab(0);//当点击的是微信的Tab就选中微信的Tabbreak;
case R.id.id_tab_frd:
selectTab(1);
break;
case R.id.id_tab_address:
selectTab(2);
break;
case R.id.id_tab_setting:
selectTab(3);
break;
}
}
//进行选中Tab的处理privatevoid selectTab(int i) {
//获取FragmentManager对象
FragmentManager manager = getSupportFragmentManager();
//获取FragmentTransaction对象
FragmentTransaction transaction = manager.beginTransaction();
//先隐藏所有的Fragment hideFragments(transaction);
switch (i) {
//当选中点击的是微信的Tab时case 0:
//设置微信的ImageButton为绿色 mWeixinImg.setImageResource(R.mipmap.tab_weixin_pressed);
//如果微信对应的Fragment没有实例化,则进行实例化,并显示出来if (mFragWeinxin == null) {
mFragWeinxin = new WeixinFragment();
transaction.add(R.id.id_content, mFragWeinxin);
} else {
//如果微信对应的Fragment已经实例化,则直接显示出来 transaction.show(mFragWeinxin);
}
break;
case 1:
mFrdImg.setImageResource(R.mipmap.tab_find_frd_pressed);
if (mFragFrd == null) {
mFragFrd = new FrdFragment();
transaction.add(R.id.id_content, mFragFrd);
} else {
transaction.show(mFragFrd);
}
break;
case 2:
mAddressImg.setImageResource(R.mipmap.tab_address_pressed);
if (mFragAddress == null) {
mFragAddress = new AddressFragment();
transaction.add(R.id.id_content, mFragAddress);
} else {
transaction.show(mFragAddress);
}
break;
case 3:
mSettingImg.setImageResource(R.mipmap.tab_settings_pressed);
if (mFragSetting == null) {
mFragSetting = new SettingFragment();
transaction.add(R.id.id_content, mFragSetting);
} else {
transaction.show(mFragSetting);
}
break;
}
//不要忘记提交事务 transaction.commit();
}
//将四个的Fragment隐藏privatevoid hideFragments(FragmentTransaction transaction) {
if (mFragWeinxin != null) {
transaction.hide(mFragWeinxin);
}
if (mFragFrd != null) {
transaction.hide(mFragFrd);
}
if (mFragAddress != null) {
transaction.hide(mFragAddress);
}
if (mFragSetting != null) {
transaction.hide(mFragSetting);
}
}
//将四个ImageButton置为灰色privatevoid resetImgs() {
mWeixinImg.setImageResource(R.mipmap.tab_weixin_normal);
mFrdImg.setImageResource(R.mipmap.tab_find_frd_normal);
mAddressImg.setImageResource(R.mipmap.tab_address_normal);
mSettingImg.setImageResource(R.mipmap.tab_settings_normal);
}
}
“微信”、“朋友”、“通讯录”、“设置”所对应的Fragment
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class WeixinFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab1, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class FrdFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab2, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class AddressFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab3, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class SettingFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab4, container, false); return view; } }
顶部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:background ="@android:drawable/title_bar" android:gravity ="center" android:layout_width ="match_parent" android:layout_height ="45dp" > < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="微信" android:textColor ="#ffffff" android:textSize ="20sp" android:textStyle ="bold" /> </ LinearLayout >
四个Tab对应页面的布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Weixin Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Friend Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Address Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Setting Tab!" /> </ LinearLayout >
底部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? 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:gravity ="center" android:background ="@color/material_blue_grey_800" android:orientation ="horizontal" > < LinearLayout android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:id ="@+id/id_tab_weixin" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_weixin_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_weixin_pressed" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="微信" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_frd" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_frd_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_find_frd_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="朋友" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_address" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_address_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_address_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="通讯录" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_setting" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_setting_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_settings_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="设置" /> </ LinearLayout > </ LinearLayout >
主布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < include layout ="@layout/top" /> < FrameLayout android:id ="@+id/id_content" android:layout_width ="match_parent" android:layout_height ="0dp" android:layout_weight ="1" > </ FrameLayout > < include layout ="@layout/bottom" /> </ LinearLayout >
完整源码 : 点击下载
可以看出,使用Fragment实现了Activity与Tab对应的页面分离,特别是当Tab对应的页面的布局和逻辑比较复杂时更能体会到使用Fragment的好处。但是单纯使用Fragment只能通过点击Tab来切换页面,并不能实现左右滑动进行切换。
下面我们通过使用 ViewPager + Fragment 的方式实现Tab,这也是开发中使用比较广泛的一种方式。
第三种:使用 ViewPager + Fragment
MainActivity.java
public
class MainActivity extends FragmentActivity implements OnClickListener {
//声明ViewPagerprivate ViewPager mViewPager;
//适配器private FragmentPagerAdapter mAdapter;
//装载Fragment的集合private List<Fragment> mFragments;
//四个Tab对应的布局private LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;
//四个Tab对应的ImageButtonprivate ImageButton mImgWeixin;
private ImageButton mImgFrd;
private ImageButton mImgAddress;
private ImageButton mImgSetting;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initViews();//初始化控件
initEvents();//初始化事件
initDatas();//初始化数据 }
privatevoid initDatas() {
mFragments = new ArrayList<>();
//将四个Fragment加入集合中
mFragments.add(new WeixinFragment());
mFragments.add(new FrdFragment());
mFragments.add(new AddressFragment());
mFragments.add(new SettingFragment());
//初始化适配器
mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {//从集合中获取对应位置的Fragmentreturn mFragments.get(position);
}
@Override
publicint getCount() {//获取集合中Fragment的总数return mFragments.size();
}
};
//不要忘记设置ViewPager的适配器 mViewPager.setAdapter(mAdapter);
//设置ViewPager的切换监听
mViewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
//页面滚动事件publicvoid onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
//页面选中事件 @Override
publicvoid onPageSelected(int position) {
//设置position对应的集合中的Fragment mViewPager.setCurrentItem(position);
resetImgs();
selectTab(position);
}
@Override
//页面滚动状态改变事件publicvoid onPageScrollStateChanged(int state) {
}
});
}
privatevoid initEvents() {
//设置四个Tab的点击事件
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
}
//初始化控件privatevoid initViews() {
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);
mTabSetting = (LinearLayout) findViewById(R.id.id_tab_setting);
mImgWeixin = (ImageButton) findViewById(R.id.id_tab_weixin_img);
mImgFrd = (ImageButton) findViewById(R.id.id_tab_frd_img);
mImgAddress = (ImageButton) findViewById(R.id.id_tab_address_img);
mImgSetting = (ImageButton) findViewById(R.id.id_tab_setting_img);
}
@Override
publicvoid onClick(View v) {
//先将四个ImageButton置为灰色 resetImgs();
//根据点击的Tab切换不同的页面及设置对应的ImageButton为绿色switch (v.getId()) {
case R.id.id_tab_weixin:
selectTab(0);
break;
case R.id.id_tab_frd:
selectTab(1);
break;
case R.id.id_tab_address:
selectTab(2);
break;
case R.id.id_tab_setting:
selectTab(3);
break;
}
}
privatevoid selectTab(int i) {
//根据点击的Tab设置对应的ImageButton为绿色switch (i) {
case 0:
mImgWeixin.setImageResource(R.mipmap.tab_weixin_pressed);
break;
case 1:
mImgFrd.setImageResource(R.mipmap.tab_find_frd_pressed);
break;
case 2:
mImgAddress.setImageResource(R.mipmap.tab_address_pressed);
break;
case 3:
mImgSetting.setImageResource(R.mipmap.tab_settings_pressed);
break;
}
//设置当前点击的Tab所对应的页面 mViewPager.setCurrentItem(i);
}
//将四个ImageButton设置为灰色privatevoid resetImgs() {
mImgWeixin.setImageResource(R.mipmap.tab_weixin_normal);
mImgFrd.setImageResource(R.mipmap.tab_find_frd_normal);
mImgAddress.setImageResource(R.mipmap.tab_address_normal);
mImgSetting.setImageResource(R.mipmap.tab_settings_normal);
}
}
“微信”、“朋友”、“通讯录”、“设置”所对应的Fragment
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class WeixinFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab1, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class FrdFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab2, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class AddressFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab3, container, false); return view; } }
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
public class SettingFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab4, container, false); return view; } }
顶部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:background ="@android:drawable/title_bar" android:gravity ="center" android:layout_width ="match_parent" android:layout_height ="45dp" > < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="微信" android:textColor ="#ffffff" android:textSize ="20sp" android:textStyle ="bold" /> </ LinearLayout >
四个Tab对应页面的布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Weixin Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Friend Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Address Tab!" /> </ LinearLayout >
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < TextView android:layout_width ="match_parent" android:layout_height ="match_parent" android:gravity ="center" android:textSize ="30sp" android:text ="The Setting Tab!" /> </ LinearLayout >
底部布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? 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:gravity ="center" android:background ="@color/material_blue_grey_800" android:orientation ="horizontal" > < LinearLayout android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:id ="@+id/id_tab_weixin" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_weixin_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_weixin_pressed" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="微信" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_frd" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_frd_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_find_frd_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="朋友" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_address" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_address_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_address_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="通讯录" /> </ LinearLayout > < LinearLayout android:id ="@+id/id_tab_setting" android:layout_width ="0dp" android:layout_height ="wrap_content" android:layout_weight ="1" android:gravity ="center" android:orientation ="vertical" > < ImageButton android:id ="@+id/id_tab_setting_img" android:clickable ="false" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:src ="@mipmap/tab_settings_normal" android:background ="#00000000" /> < TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:textColor ="#ffffff" android:text ="设置" /> </ LinearLayout > </ LinearLayout >
主布局文件
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
<? xml version="1.0" encoding="utf-8" ?> < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:orientation ="vertical" android:layout_width ="match_parent" android:layout_height ="match_parent" > < 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 >
完整源码 : 点击下载
使用 ViewPager + Fragment 的方式综合了使用ViewPager和使用Fragment的优势,即:既能使用Fragment管理Tab对应页面的布局及业务逻辑的实现,使得Activity与Tab对应的页面分离,又能使用ViewPager实现左右滑动切换页面的效果。这种方式需要为ViewPager设置FragmentPagerAdapter适配器,关于适配器的知识可参考我之前写的一篇文章: Android必学之数据适配器BaseAdapter
原文:http://www.cnblogs.com/caobotao/p/5103673.html
内容总结
以上是互联网集市为您收集整理的三种实现Android主界面Tab的方式全部内容,希望文章能够帮你解决三种实现Android主界面Tab的方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。