android底部导航框架可以说是目前最常用的框架,看似非常简单的框架如果搭建不好后期会出现各种意想不到问题;

比如我前面两篇写的每次点击底部图标fragment之间会来回替换,这样肯定不实用;这个demo使用add(),hide(),show()代替replace()

再者当打开app之后按home键退出,浏览其他app当内存重启的时候再次打开我们的app会出现四个fragment重现的问题;

经过我们伟大的测试不断的努力下,进入首页立马退出,然后再进入...如此反复操作会出现getActivity()报空指针;

想要更深入的了解fragment推荐给大家一篇文章:http://www.jianshu.com/p/d9143a92ad94

如果大家手里没有成熟的框架,可以直接到文章底部下载源码,可以直接使用;

整体的大布局是一个线性布局,按照权重8:1分配fragment的父布局和下面的底部导航栏

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="www.relative.com.relativeframe.MainActivity"><!--存放fragment--><FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="0dp"android:layout_above="@+id/tab_layout"android:layout_weight="8"></FrameLayout><!--底部导航--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:gravity="bottom"android:layout_weight="1"><includeandroid:id="@+id/tab_layout"layout="@layout/view_main_tab" /></LinearLayout>
</LinearLayout>

底部导航也是一个线性布局,我们重点看下“进货单”,其他三个也一样,只不过没有显示消息的TextView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="56dp"android:layout_alignParentBottom="true"android:orientation="horizontal"android:background="#27282c"><!--首页--><RelativeLayout/><!--商品--><RelativeLayout /><!--进货单--><RelativeLayoutandroid:id="@+id/shopping_cart_page"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="4dp"android:layout_weight="1"><RadioButtonandroid:id="@+id/shopping_cart_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@null"android:button="@null"android:clickable="false"android:drawablePadding="5dp"android:drawableTop="@drawable/selector_tab_stock_list"android:gravity="center"android:text="进货单"android:textColor="@drawable/tab_text_selector"android:textSize="10sp" /><TextViewandroid:id="@+id/shopping_cart_num"android:layout_width="16dp"android:layout_height="16dp"android:layout_alignRight="@id/shopping_cart_button"android:layout_alignTop="@id/shopping_cart_button"android:layout_marginTop="-6dp"android:layout_gravity="right"android:background="@drawable/msg_num_shape"android:clickable="false"android:gravity="center"android:text="99+"android:textColor="@color/white"android:textSize="8sp" /></RelativeLayout><!--会员--><RelativeLayout /></LinearLayout>

布局写法很多,但是万变不离其宗,几乎都差不多;

其实逻辑也比较简单:

第一:初始化view和fragment(将fragment保存到一个集合)

第二:显示选中的Fragment

第三:处理RadioButton的点击事件,当点击的时候显示对应的Fragment并且改变RadioButton的状态

第四:重写onSaveInstanceState()方法,注销super...

  protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);fragmentManager = getSupportFragmentManager();initView();// 显示选中的 FragmentshowFragment();}//初始化view和fragmentprivate void initView() {fragmentList.add(new HomeFragment());fragmentList.add(new GoodsFragment());fragmentList.add(new ShoppingFragment());fragmentList.add(new UserFragment());...}@Override//RadioButton点击事件public void onClick(View v) {switch (v.getId()) {case R.id.homepage://首页currentIndex = 0;changeState(true, false, false, false);break;case R.id.goods_page://商品currentIndex = 1;changeState(false, true, false, false);break;case R.id.shopping_cart_page://进货单currentIndex = 2;changeState(false, false, true, false);break;case R.id.user_page://会员currentIndex = 3;changeState(false, false, false, true);break;}showFragment();}//改变RadioButton的状态private void changeState(boolean homeB, boolean goodsB, boolean shopB, boolean userB) {btnHome.setChecked(homeB);btnGoods.setChecked(goodsB);btnShopCart.setChecked(shopB);btnUserVip.setChecked(userB);}// 显示选中的 Fragmentprivate void showFragment() {Fragment currentFragment = fragmentList.get(currentIndex);FragmentTransaction ft = fragmentManager.beginTransaction();//如果当前的fragment没有添加,添加当前的fragmentif(!currentFragment.isAdded()){/*** 把fragment添加到MainActivity中* 第一个参数:fragment添加的位置;(必须是布局容器,一般是一个framelayout)* 第二个参数:要添加的fragment对象*/ft.add(R.id.fragment_container, currentFragment);}for(int x=0;x<fragmentList.size();x++){if(fragmentList.get(x)!=currentFragment){//隐藏不需要显示的Fragment,仅仅是设为不可见,并不会销毁ft.hide(fragmentList.get(x));}else {ft.show(fragmentList.get(x));}}ft.commit();}@Overrideprotected void onSaveInstanceState(Bundle outState) {//super.onSaveInstanceState(outState);}

最后注销的super.onSaveInstanceState()方法是系统的方法,在内存重启的时候会调用,作用就是在内存重启的时候不让系统做任何操作,这样就不会出现重叠现象;

解决getActivity()空指针,需要创建一个Fragment的基类(BaseFragment),然后在BaseFragment中:

public class BaseFragment extends Fragment {private Activity mActivity;@Override/*** 当Fragment与Activity发生关联时调用** 在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,* 使用mActivity代替getActivity(),保证Fragment即使在onDetach后,仍持有Activity的引用*/public void onAttach(Context context) {super.onAttach(context);this.mActivity = (Activity) context;}}

点击打开链接免费下载源码

Android底部导航框架(解决fragment界面重现,getActivity空指针)相关推荐

  1. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  2. VS 2015 开发Android底部导航条----[实例代码,多图]

    1.废话背景介绍  在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual St ...

  3. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  4. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  5. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  6. Android 底部导航栏-极致简单版

    底部导航栏是常用的一个工具,大多数的APP都带有底部导航栏,底部导航栏可以方便用户一只手操作,切占用内存比常规的Activity少,底部导航栏使用Fragment+RadioGroup方法来实现,示意 ...

  7. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  8. Android底部导航栏最常用的两种写法

    先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost  , LinearLayout + ImageView + T ...

  9. android 固定底部导航,如何设置android底部导航栏位置固定在android

    请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...

最新文章

  1. Easyui 让DataGrid适应浏览器宽度
  2. 兼容iOS Android,React Native兼容iOS Android的TabBar
  3. 【企业管理】人力资源是CEO的第一工程
  4. 转载:【opencv入门教程之三】:图片的载入|显示|输出
  5. Qt工作笔记-对主事件循环的进一步认识
  6. java如何配置maven路径_如何配置Eclipse构建路径以使用Maven依赖项?
  7. linux shell编程if语句内判断参数
  8. 2PC 二阶段提交协议与3PC
  9. 小米计算机视觉算法工程师面试题
  10. 从致远OA-ajax.do未授权文件上传漏洞复现
  11. 《心灵捕手》中的10段经典台词(10 classic lines from Good Will Hunting)
  12. word怎么压缩文件大小,word压缩变小
  13. PTA L2-043 龙龙送外卖
  14. Android 上 NFC 应用
  15. WLW blog 小技巧
  16. js截取数组slice() 和 splice() 的用法
  17. weblogic 启动常见错误解决
  18. 土地经济学笔记第一部分
  19. cscd期刊是c刊吗_cscd期刊和cssci级别哪个高
  20. 【进阶之路】Mysql与Oracle的区别

热门文章

  1. GhostNet代码解析
  2. 当CollapsingToolbarLayout与ToolBar如何设置Title居中
  3. Asp.net Ajax Control Toolkit设计编程备忘录(色眼窥观版)——第4回(忍者专辑)
  4. 泡沫消防车电控系统解决方案
  5. 物理学和数学能完整描述真实吗?
  6. 360手机刷机:360N6pro刷机
  7. Java图片截图缩放工具
  8. fedora 16 linux 配置 MP3 RMVB 解码器
  9. IDEA思维导图生成插件
  10. 关于“已知有两孩子,第一个孩子为女孩,求第二个孩子为女孩的概率”的个人见解