当前位置: 首页 > article >正文

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

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"?>
<RelativeLayout
        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"
>
    <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;
    @Override
    protected 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.kler.cn/a/408759.html

相关文章:

  • 基于Java Springboot公园管理系统
  • SpringBoot+SpringCloud面试题整理附答案
  • opencv-python 分离边缘粘连的物体(距离变换)
  • CPU命名那些事
  • 大语言模型---Llama7B和Llama8B的区别;模型参数量;权重文件的不同;嵌入层权重的不同;输入序列长度的不同;应用场景
  • 【GD32】(三) ISP基本使用
  • mysql-分析并解决mvcc更新丢失问题
  • shell完结
  • git标签和分支
  • 如何在WPF中嵌入其它程序
  • 数据结构--链表实现栈和队列
  • 构建功能完备的Flask Web应用
  • Flink转换算子——flatMap/map/filter/keyby/reduce综合案例
  • meterpreter常用命令 上
  • Python爬虫:如何优雅地获取1688商品详情接口
  • 使用windows窗口展示go-echarts图表
  • Stable Diffusion中的自注意力替换技术与Diffusers实现
  • React中Ant Design组件日期编辑回显
  • 【FPGA开发】Vivado自定义封装IP核,绑定总线
  • ajax (一)
  • timm库加载的模型可视化
  • 【Python-办公自动化】实现自动化输出模板表格报告
  • MongoDB 中设置登录账号密码可以通过以下步骤实现
  • 基于SSM的婚庆管理系统+LW示例参考
  • 了解rk3588单片机
  • 大模型工程化部署:使用FastChat部署基于OpenAI API兼容大模型服务