前几天,项目中要实现这么一个功能。就配置了下。其实很简单,首先 需要阅读下我转载的前两篇文章,都是转载的郭神的,写的非常好。我的项目中逢者必用,其实就相当于一个很好的框架来使用,非常方便。

前两篇的项目地址Android Fragment应用实战,使用碎片向ActivityGroup说再见和Android ActionBar应用实战,高仿微信主界面的设计,认真阅读,你会感觉到受益颇深。(当然,如果你不是大神)

其实和前两篇都重复了,都不想粘贴代码了,为了便于学习,还是粘贴上吧。

首先,写了一个BaseActivity,便于封装一些方法继承

public class BaseActivity extends FragmentActivity {protected Context mContext;@Overrideprotected void onCreate(Bundle arg0) {// TODO Auto-generated method stubsuper.onCreate(arg0);ActionBar actionBar = getActionBar();actionBar.hide();//隐藏标题栏mContext = this;}protected void Toasters(String message) {Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();}}

首先,应用启动后会进入MainActivity,此Activity会加载三个Fragment,随便定义三个(首页,消息,我的)

效果图如下:

首页,消息,我的,三个fragment大同小异,布局在fragment类中加载出来就行,这里就不粘贴代码了。

最终要的是MainActivity,加载了三个fragment,点击效果,显示效果。其实是首次点击的时候首次加载了fragment,后来点击就隐藏了其他的fragment,显示了当前的fragment,这里需要处理隐藏其他的fragment,避免了多个fragment显示到界面上。

public class MainActivity extends BaseActivity implements OnClickListener {/*** 首页**/private LinearLayout main_linear_home;private ImageView main_imageview_home;private TextView main_txtview_home;/*** 消息**/private LinearLayout main_linear_msg;private ImageView main_imageview_msg;private TextView main_txtview_msg;/*** 我的**/private LinearLayout main_linear_user;private ImageView main_imageview_user;private TextView main_txtview_user;/*** 用于对Fragment进行管理*/private FragmentManager fragmentManager;/*** 选中的颜色值*/private int main_txtColor_sel = 0;/*** 正常颜色值*/private int main_txtColor_nol = 0;/*** FrameLayout*/private FrameLayout main_new_frame;private HomeFragment homeFragment;private MessageFragment messageFragment;private MyFragment myFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setOnClickEvent();// 初始化API}/*** @Description: TODO 初始化布局控件* @author Sunday* @date 2016年3月26日*/private void initView() {// TODO Auto-generated method stubmain_new_frame = (FrameLayout) findViewById(R.id.main_new_frame);// 布局main_linear_home = (LinearLayout) findViewById(R.id.main_linear_home);main_linear_msg = (LinearLayout) findViewById(R.id.main_linear_msg);main_linear_user = (LinearLayout) findViewById(R.id.main_linear_my);// 底部图片main_imageview_home = (ImageView) findViewById(R.id.main_imageview_home);main_imageview_msg = (ImageView) findViewById(R.id.main_imageview_msg);main_imageview_user = (ImageView) findViewById(R.id.main_imageview_my);// 底部文字main_txtview_home = (TextView) findViewById(R.id.main_txtview_home);main_txtview_msg = (TextView) findViewById(R.id.main_txtview_msg);main_txtview_user = (TextView) findViewById(R.id.main_txtview_my);fragmentManager = getSupportFragmentManager();main_txtColor_nol = getBaseContext().getResources().getColor(R.color.main_txt_nor);main_txtColor_sel = getBaseContext().getResources().getColor(R.color.main_txt_sel);setTabSelection(0);}private void setOnClickEvent() {main_linear_home.setOnClickListener(this);main_linear_msg.setOnClickListener(this);main_linear_user.setOnClickListener(this);}/***/@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.main_linear_home:setTabSelection(0);break;case R.id.main_linear_msg:setTabSelection(1);break;case R.id.main_linear_my:setTabSelection(2);break;default:break;}}/*** * @Description: TODO 底部切换选择fragment* @author Sunday* @date 2016年3月26日*/public void setTabSelection(int index) {// 底部切换clearSelection(index);// 开启一个Fragment事务FragmentTransaction transaction = fragmentManager.beginTransaction();// 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况hideFragments(transaction);switch (index) {case 0:if (homeFragment == null) {homeFragment = new HomeFragment();transaction.add(R.id.main_new_frame, homeFragment);} else {transaction.show(homeFragment);}break;case 1:if (messageFragment == null) {messageFragment = new MessageFragment();transaction.add(R.id.main_new_frame, messageFragment);} else {transaction.show(messageFragment);}break;case 2:if (myFragment == null) {myFragment = new MyFragment();transaction.add(R.id.main_new_frame, myFragment);} else {transaction.show(myFragment);}break;}transaction.commit();}/*** * @Description: TODO 清除选中状态* @author Sunday* @date 2016年3月26日*/private void clearSelection(int index) {main_imageview_home.setImageResource(R.drawable.shouye_normal);main_txtview_home.setTextColor(main_txtColor_nol);main_imageview_msg.setImageResource(R.drawable.massage_normal);main_txtview_msg.setTextColor(main_txtColor_nol);main_imageview_user.setImageResource(R.drawable.my_normal);main_txtview_user.setTextColor(main_txtColor_nol);if (index == 0) {main_imageview_home.setImageResource(R.drawable.shouye_pressed);main_txtview_home.setTextColor(main_txtColor_sel);}if (index == 1) {main_imageview_msg.setImageResource(R.drawable.massage_pressed);main_txtview_msg.setTextColor(main_txtColor_sel);}if (index == 2) {main_imageview_user.setImageResource(R.drawable.my_pressed);main_txtview_user.setTextColor(main_txtColor_sel);}}/*** * @Description: TODO 隐藏所有的fragment,防止多个fragment显示在界面* @author Sunday* @date 2016年3月26日*/private void hideFragments(FragmentTransaction transaction) {if (homeFragment != null) {transaction.hide(homeFragment);}if (messageFragment != null) {transaction.hide(messageFragment);}if (myFragment != null) {transaction.hide(myFragment);}}// 定义一个变量,来标识是否退出private static boolean isExit = false;Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);isExit = false;}};/*** 处理返回键事件*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {exit();return false;}return super.onKeyDown(keyCode, event);}private void exit() {if (!isExit) {isExit = true;Toasters("再按一次退出应用");// 利用handler延迟发送更改状态信息mHandler.sendEmptyMessageDelayed(0, 2000);} else {finish();System.exit(0);}}
}

其实就这么简单的实现了框架的搭建,开发中其实很多项目都是采用了这种框架。

现在,我们再来研究下,让首页加载ViewPager,ViewPager嵌套了三个fragment,fragment可以点击切换,也可以滑动切换。

tab滑动的效果,我们任然是使用的第三方的开源框架PagerSlidingTabStrip,稳定性非常好,还可以随意修改源码。

首先需要将PagerSlidingTabStrip的源码下载下来,并集成到我们的项目当中,PagerSlidingTabStrip的GitHub主页地址是:https://github.com/astuetz/PagerSlidingTabStrip 。

最重要的HomeFragment的代码如下:

public class HomeFragment extends Fragment {/*** PagerSlidingTabStrip的实例*/private PagerSlidingTabStrip tabs;/*** 获取当前屏幕的密度*/private DisplayMetrics dm;private OneFragment oneFragment;private TwoFragment twoFragment;private ThreeFragment threeFragment;/* **/@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// TODO Auto-generated method stubView view = inflater.inflate(R.layout.fragment_home, null);setOverflowShowingAlways();dm = getResources().getDisplayMetrics();ViewPager pager = (ViewPager)view. findViewById(R.id.pager);pager.setOffscreenPageLimit(0);//设置ViewPager的缓存界面数,默认缓存为2tabs = (PagerSlidingTabStrip) view.findViewById(R.id.tabs);pager.setAdapter(new MyPagerAdapter(getChildFragmentManager()));tabs.setViewPager(pager);setTabsValue();return view;}/*** 对PagerSlidingTabStrip的各项属性进行赋值。*/private void setTabsValue() {// 设置Tab是自动填充满屏幕的tabs.setShouldExpand(true);// 设置Tab的分割线是透明的tabs.setDividerColor(Color.TRANSPARENT);// 设置Tab底部线的高度tabs.setUnderlineHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, dm));// 设置Tab Indicator的高度tabs.setIndicatorHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, dm));// 设置Tab标题文字的大小tabs.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, dm));// 设置Tab Indicator的颜色tabs.setIndicatorColor(Color.parseColor("#d83737"));//#d83737   #d83737(绿)// 设置选中Tab文字的颜色 (这是我自定义的一个方法)tabs.setSelectedTextColor(Color.parseColor("#ffffff"));// 取消点击Tab时的背景色tabs.setTabBackground(0);}public class MyPagerAdapter extends FragmentPagerAdapter {public MyPagerAdapter(FragmentManager fm) {super(fm);}private final String[] titles = { "TAB1", "TAB2", "TAB3" };@Overridepublic CharSequence getPageTitle(int position) {return titles[position];}@Overridepublic int getCount() {return titles.length;}@Overridepublic Fragment getItem(int position) {switch (position) {case 0:if (oneFragment == null) {oneFragment = new OneFragment();}return oneFragment;case 1:if (twoFragment == null) {twoFragment = new TwoFragment();}return twoFragment;case 2:if (threeFragment == null) {threeFragment = new ThreeFragment();}return threeFragment;default:return null;}}}private void setOverflowShowingAlways() {try {ViewConfiguration config = ViewConfiguration.get(getParentFragment().getActivity());Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");menuKeyField.setAccessible(true);menuKeyField.setBoolean(config, false);} catch (Exception e) {e.printStackTrace();}}}

其次,布局文件也拿上来了

<?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" ><com.sunday.slidetabfragment.view.PagerSlidingTabStripandroid:id="@+id/tabs"android:layout_width="match_parent"android:layout_height="45dp"android:background="@color/light_black_bg" /><android.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

最终的效果图如下:

效果就如期待的那样,是不是觉得超级简单。如果要是觉得难看,tab样式和颜色当然是可以修改的,图片也可以使用UI设计的。

源码地址,点击下载

Android Fragment嵌套ViewPager,ViewPager嵌套多个Fragment相关推荐

  1. Activity嵌套fragment大全,activity加载单个fragment,TabLayout+ViewPager实现多个fragment滑动效果

    加载单个fragment效果                                                                        头部标题多个fragment ...

  2. Android嵌套式ViewPager,垂直ViewPager

    In this tutorial, we'll be implementing android nested ViewPager i.e a ViewPager within a ViewPager. ...

  3. Android 解决ViewPager双层嵌套的滑动问题

    Android 解决ViewPager双层嵌套的滑动问题 参考文章: (1)Android 解决ViewPager双层嵌套的滑动问题 (2)https://www.cnblogs.com/zhujia ...

  4. Fragment 嵌套ViewPager(ViewPager里面有多个Fragment)

    首先扯点别的:总是感觉自己学啥啥不会,吃啥啥没够.整日活在回忆和幻想之中,也是艰难啊.但是比我艰难的人多了,我算老几.(宋小宝这句话说得挺好)所以虽然艰难,还是要努力奋斗,别人或许比你更艰难,你比别人 ...

  5. ViewPager相互嵌套,导致子ViewPager无法滑动,且子ViewPager中的view无法被点击

        场景:当使用ViewPager进行嵌套的时候,子viewPager是无法进行嵌套的,因此我们要重写ViewPager类,并重写里层viewPager类中的onTouchEvent方法,调用其父 ...

  6. android 弹出fragment,Android中ViewPager获取当前显示的Fragment

    前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...

  7. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740977 Android如今实现Tab类型的界面方式越来越多,今天就把常见的 ...

  8. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  9. android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...

    在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android- ...

  10. android listview动态添加viewpager,向 ViewPager 中添加 包含 ListView 的 Fragment

    对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. ...

最新文章

  1. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》
  2. SQL Server 数据库定时自动备份
  3. python3 随机数 质数 素数 文件操作
  4. 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)
  5. ElasticSearch快速入门二(Restful介绍)
  6. Android酷炫有用的开源框架
  7. c语言一些简单的程序
  8. RF 无法连接到服务器,这可能由于连接的服务不存在,TCP 错误代码 10061
  9. 20个最热门的IT技术职位及薪资
  10. Error: GPG check FAILED
  11. HashMap、ConcurrentHashMap原理分析
  12. 黑苹果开启——HiDPI 技术
  13. 域名与服务器如何绑定?
  14. 中国传媒大学计算机课程表,中国传媒大学新闻学院课程表.doc
  15. Ubuntu18.04 没有有以太网连接的解决办法
  16. ucweb7.0 for WM/PPC/SP/S60V1/S60V2/S60V3/S60V5/ 平台安装包下载
  17. TCP/IP 之大明王朝邮差
  18. 项目经理三大法宝之一挣值管理详解
  19. MAX24——3Dmax中出现蒙皮封套权重失效解决办法
  20. 进程管理命令 动态监控进程 rpm yum

热门文章

  1. 【Android】安卓webview播放视频白屏解决方法
  2. Webex助力Innokids消除沟通隔阂,成就无边界创作
  3. win7上安装microsoft edge浏览器, 模拟ie11模式
  4. 企业公众号推送什么内容?企业公众号内容可以发哪些?
  5. 最受DBA欢迎的数据库技术文档-巡检篇
  6. 深度学习 3d人脸 重建_深度学习实时3D人脸跟踪
  7. Golang开发入门
  8. android多线程讲解与实例
  9. Smalltalk for Everyone Else
  10. 容联云 PHP 实现短信发送验证码