Java安卓导航栏设计开发(实战篇)——第十一期

embedded/2024/11/25 13:19:18/

1,设计构思:

        导航栏应当具备以下条件:

  1. 点击导航栏中的按钮,以用来切换界面
  2. 点击导航栏应当只显示目前界面变色图标
  3. 导航栏应当附贴到全部界面的最下方

        ——既然需要附贴到最下方,可以使用【相对布局 <RelativeLayout>】中的属性:

android:layout_alignParentBottom="true"

         ——如果我们需要让程序灵活,切换的界面应当用【Fragment】而不是【Activity】,因此父布局应当继承【AppCompatActivity】而不是【Activity】


 2,资源准备:

        在编程之前,我们应当要找合适的图片资源以用来充当按钮图标

        如果你也觉得baidu很烦还有水印,那么不妨试试Android自带的icon(图标)库:

        右键res文件夹-->新建(N)-->Image Assets:


        左半边如图:

  1.  Name:资源名名称
  2. Asset type:资源类型 (image 图片 ,clip art 剪切画,text 文本)
  3. Clip art:点击用来选择资源
  4. Trim:是否去除透明效果
  5. Padding:外边缘
  6. Foreground:图标颜色
  7. Background:图标背景颜色

3,XML:

        当你的mipmap图形文件资源添加好后:

        于是我们就可以用【RelativeLayout】 装一个【LinearLayout】然后自定义【底部导航栏】了,个人觉得这是最基础的办法,其代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns: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"
><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/fragment_part"android:orientation="vertical"android:gravity="center"/><LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:orientation="horizontal"android:gravity="center"><ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_weight="1"android:src="@mipmap/ic_add_circle"android:adjustViewBounds="true"android:maxHeight="38dp"android:id="@+id/add_fragment_button"android:background="@color/white"/><ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_weight="1"android:src="@mipmap/ic_data"android:adjustViewBounds="true"android:maxHeight="38dp"android:id="@+id/data_fragment_button"android:background="@color/white"/><ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_weight="1"android:src="@mipmap/ic_info"android:adjustViewBounds="true"android:maxHeight="38dp"android:id="@+id/info_fragment_button"android:background="@color/white"/><ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_weight="1"android:src="@mipmap/ic_more"android:adjustViewBounds="true"android:maxHeight="38dp"android:id="@+id/more_fragment_button"android:background="@color/white"/></LinearLayout></RelativeLayout>

我在【相对布局】中有放置了两个【线性布局】,上面一个用来放【碎片Fragment】,下面则是【导航栏】,下面的线性布局中有定义了4个横向占比一模一样的【图像按钮】,这一步读者应该能看懂源代码。


 4,Java:

TODO:

  • 点击后要求图片变颜色,并且不能同时两个图片换颜色
  • 点击后跳转Fragment

先来定义变颜色模块:

                思路很简单,点击后将【所有图片】归为【初始图片】,然后再把【被点击图片】变成【有色的】即可 

                首先,让我们先把所有图片资源找到并实例化:

    private ImageButton add_fragment_button;private ImageButton data_fragment_button;private ImageButton info_fragment_button;private ImageButton more_fragment_button;@Overrideprotected void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_menu);data_fragment_button = findViewById(R.id.data_fragment_button);add_fragment_button = findViewById(R.id.add_fragment_button);info_fragment_button = findViewById(R.id.info_fragment_button);more_fragment_button = findViewById(R.id.more_fragment_button);ImageButton[] imageButtons = { add_fragment_button , data_fragment_button , info_fragment_button , more_fragment_button };int[] res = { R.mipmap.ic_add_circle , R.mipmap.ic_data , R.mipmap.ic_info , R.mipmap.ic_more };/*省略若干个代码*/}

                其次在定义【初始化所有图片函数】 :

public void resetAllImageSource( ImageButton[] imageButtons , int[] res ){if (imageButtons.length != res.length )throw new IllegalArgumentException("图像按钮与资源数量不匹配");for ( int i = 0 ; i < imageButtons.length ; i++)imageButtons[i].setImageResource(res[i]);}

        再然后设置点击更换【Fragment】事务函数:

public void changeFragment(int id , Fragment fragment){FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.add(id , fragment);fragmentTransaction.commit();}

        之后给【图片按钮】设置【监听事件】,并且调用以上俩函数: 

add_fragment_button.setOnClickListener(view -> {resetAllImageSource(imageButtons , res);add_fragment_button.setImageResource(R.mipmap.ic_add_circle_colored);addFragment addFragment = new addFragment();changeFragment( R.id.fragment_part , addFragment);});
//下同,这里只举例一个

5,总结:

        到这一步导航栏功能设置完毕,本章需要读者注意是否图形资源成功添加,以及前几章所提到的碎片(Fragment)功能的使用,总体难度不算太高。


http://www.ppmy.cn/embedded/140384.html

相关文章

《Python基础》之循环结构

目录 简介 一、for循环 1、基本语法与作用 2、使用 range() 函数配合 for 循环 3、嵌套的for循环 二、while循环 1、基本语法与作用 2、while 循环嵌套 &#xff08;1&#xff09;、while循环与while循环嵌套 &#xff08;2&#xff09;、while循环与for循环嵌套 简介 …

原生安卓和ios开发的app和uniapp开发的app都有什么特点

原生安卓和iOS开发的app与uniapp开发的app在开发成本、性能表现以及用户体验等方面存在区别。以下是具体分析&#xff1a; 开发成本 原生安卓和iOS开发&#xff1a;需要分别为每个平台编写代码&#xff0c;因此开发成本较高。开发者需要具备多个平台的专业知识&#xff0c;这增…

网络编程day2.2~day3——TCP并发服务器

笔记脑图 作业&#xff1a;多进程多线程并发服务器实现一遍提交。 多进程 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 void fun(int sss) {if(sssSIGCHLD){…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

图像处理 - 色彩空间转换

色彩空间转换的含义与原理 色彩空间转换是指将一种颜色模型或表示方式中的颜色数据映射到另一种颜色模型中的过程。色彩空间&#xff08;Color Space&#xff09;本质上是一个三维坐标系统&#xff0c;每个点都表示图像中的某种颜色。在实际应用中&#xff0c;由于不同的色彩空…

子矩阵的和(矩阵前缀和)

题目链接&#xff1a;用户登录 - C语言网 在这里可以模拟一下就知道了&#xff0c; 记录每个 &#xff08;0&#xff0c;0&#xff09; 到 &#xff08;i,j&#xff09;的矩阵和 然后区间子矩阵的和&#xff0c;就减去多余的部分的矩阵和就可以得到了 子矩阵的和 然后 这里最…

一、语言及算法基础篇--​基础(一) C++语言​--第一章 C++语言入门

一、语言及算法基础篇 基础(一) C语言 第一章 C语言入门 题号题目名称题解1000入门测试题目1000&#xff1a;入门测试题目&#xff08;http://ybt.ssoier.cn:8088/problem_show.php?pid1000&#xff09;2060【例1.1】计算机输出2061【例1.2】梯形面积2061&#xff1a;【例1.…

晶圆测试中自动化上下料的重要性与应用

随着科技的飞速发展&#xff0c;硅光技术在通信、数据处理等领域展现出巨大的应用潜力。硅光晶圆作为硅光技术的核心源头组件&#xff0c;其性能的稳定性和可靠性对于整个系统的运行至关重要。因此&#xff0c;对硅光晶圆的测试成为生产过程中不可或缺的一环。近年来&#xff0…