热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android利用碎片fragment实现底部标题栏(Github模板开源)

Fragment可以作为Activity的组成部分,一个Activity可以有多个Fragment,这篇文章主要介绍了Android利用碎片fragment实现底部标题栏(Github模板开源),需要的朋友可以参考下

 fragment特点

  • Fragment与Activity相似,有自己的生命周期,布局。相当于一个迷你的Activity
  • Fragment可以作为Activity的组成部分,一个Activity可以有多个Fragment
  • 一个Fragment可以被多个Activity重用
  • 在Activity运行时可动态地加入、移除、交换Fragment
  • 一个具有自己生命周期的控件,有自己的处理输入事件的能力
  • 依赖于Activity,能互相通信和托管。

在安卓开发当中,一个十分重要的布局则是底部标题栏了,拥有了底部标题栏,我们就拥有了整个软件UI开发的框架,一般而言,整个软件的布局首先就是从底部标题栏开始构建,然后再开始其他模块的编写,组成一个完善的软件,那么如何才能够编写一个底部标题栏呢,我这里使用了碎片来实现,当然是碎片的动态加载的方式,静态加载的话则不可以达到点击按钮切换碎片的功能。

首先先上效果图:

github项目地址:https://github.com/Geeksongs/ButtonTitile

 在每一个底部标题栏上一共有四个分类吗,分别是主页,地点,聊天和设置。每一个分类都对应着上方的一个fragment,因此我们需要创建四个fragment来对应下面的每一个分类,下面的底部导航栏不是由fragment来实现的,而是直接在主布局activity_main.xml当中使用imageview和textview组合而成。在activity_main.xml的上方是fragment,因此使用帧布局framelayout,下面是activity_main.xml的布局代码:

一.activity_main.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
  
  

编写好的界面如下:

 然后在我们最开始的演示视频当中大家也看到了我们每点击一次按钮,按钮的颜色就会发生变化,因此我们需要为每一个按钮编写选择器selector,这里就只展示第一个选择器"主页"的selector吧,还有三个按钮,咱们可以利用同样的方式建立selector,如果想要了解其他按钮的selector编写的话,请前往github:https://github.com/Geeksongs/ButtonTitile

二.home.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

其中上面的图片我均放置在了drawble文件夹当中,这里强烈推荐阿里云矢量图标库,在这里可以找到你想要图标,网址如下:https://www.iconfont.cn/。然后找到你所需要的图标之后就可以进行下载啦!

三.fragment1.java

接下来是对碎片fragment1.java代码的编写,在这段代码的编写当中所需要注意的是我们将会返回整个fragment.xml的view布局,而不是直接返回一个textview或者imageview之类的控件,这样会让初学者感到十分困惑,为什么不返回整个fragment所对应的xml界面,代码如下:

import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
 * A simple {@link Fragment} subclass.
 */
public class Fragment1 extends Fragment {
  private String fragmentText;
  private TextView fragmentTextView;
  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_fragment1,container,false);
    return view;//返回view布局
  }
  public Fragment1(String fragmentText) {
    this.fragmentText=fragmentText;
  }
}

其余几个fragment的代码也差不多,只是其构造方法的名称略有不同,所使用了fragment1(2/3/4),毕竟它们的类名不同嘛。编写了fragment的Java代码,是时候编写fragment的xml代码了,因为这样才可以将编写好的界面传递到主界面:activity_main.xml当中,代码如下:

四.fragment1.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

由于安卓默认的字体比较小,我就略微修改了一下将字体的大小修改为了30dp,当然你也可以根据自己的需要进行改动,这个fragment文件我们一共需要建立4份,毕竟有四个底部标题栏的按钮。

五.MainActivity.java

下面是主活动的Java代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  LinearLayout homeLinear;
  LinearLayout listLinear;
  LinearLayout polyLinear;
  LinearLayout userLinear;
  Fragment1 fragmentHome;
  Fragment2 fragmentList;
  Fragment3 fragmentPoly;
  Fragment4 fragmentUser;
  private FragmentManager mfragmentManger;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    homeLinear= (LinearLayout) findViewById(R.id.home);
    listLinear= (LinearLayout) findViewById(R.id.location);
    polyLinear= (LinearLayout) findViewById(R.id.linear_polymer);
    userLinear= (LinearLayout) findViewById(R.id.linear_user);
    homeLinear.setOnClickListener(this);
    listLinear.setOnClickListener(this);
    polyLinear.setOnClickListener(this);
    userLinear.setOnClickListener(this);
    mfragmentManger = getSupportFragmentManager();
    homeLinear.performClick();
  }
  @Override
  public void onClick(View view) {
    FragmentTransaction fragmentTransaction = mfragmentManger.beginTransaction();//只能是局部变量,不能为全局变量,否则不能重复commit
    //FragmentTransaction只能使用一次
    hideAllFragment(fragmentTransaction);
    switch (view.getId()){
      case R.id.home:
        setAllFalse();
        homeLinear.setSelected(true);
        if (fragmentHome==null){
          fragmentHome=new Fragment1("Home");
          fragmentTransaction.add(R.id.fragment_frame,fragmentHome);
        }else{
          fragmentTransaction.show(fragmentHome);
        }
        break;
      case R.id.location:
        setAllFalse();
        listLinear.setSelected(true);
        if(fragmentList==null){
          fragmentList=new Fragment2("List");
          fragmentTransaction.add(R.id.fragment_frame,fragmentList);
        }else {
          fragmentTransaction.show(fragmentList);
        }
        break;
      case R.id.linear_polymer:
        setAllFalse();
        polyLinear.setSelected(true);
        if(fragmentPoly==null){
          fragmentPoly=new Fragment3("Polymer");
          fragmentTransaction.add(R.id.fragment_frame,fragmentPoly);
        }else {
          fragmentTransaction.show(fragmentPoly);
        }
        break;
      case R.id.linear_user:
        setAllFalse();
        userLinear.setSelected(true);
        if(fragmentUser==null){
          fragmentUser=new Fragment4("User");
          fragmentTransaction.add(R.id.fragment_frame,fragmentUser);
        }else {
          fragmentTransaction.show(fragmentUser);
        }
        break;
    }
    fragmentTransaction.commit();//记得必须要commit,否则没有效果
}
  private void hideAllFragment(FragmentTransaction fragmentTransaction) {
    if(fragmentHome!=null){
      fragmentTransaction.hide(fragmentHome);
    }
    if(fragmentList!=null){
      fragmentTransaction.hide(fragmentList);
    }
    if(fragmentPoly!=null){
      fragmentTransaction.hide(fragmentPoly);
    }
    if(fragmentUser!=null){
      fragmentTransaction.hide(fragmentUser);
    }
  }
  private void setAllFalse() {
    homeLinear.setSelected(false);
    listLinear.setSelected(false);
    polyLinear.setSelected(false);
    userLinear.setSelected(false);
  }
}

咱们的底部标题栏就这样完美地实现啦,对于代码和整个工程布局还不太明白的地方可以参见github源码:https://github.com/Geeksongs/ButtonTitile,欢迎star呀!

总结

以上所述是小编给大家介绍的Android利用碎片fragment实现底部标题栏(Github模板开源),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 本文深入探讨了 com.example.android.sunshine.data.TestUtilities 中 validateThenCloseCursor() 方法的使用方法及其代码示例,旨在帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
author-avatar
手机用户2602938185
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有