构建安卓项目通用TitleBar

简介: 构建安卓项目通用TitleBar

前言

每个项目的每个页面基本都会写头布局,但如果每个布局都写一遍头布局的话未免太过于麻烦,所以想着直接写一个吧。

第一种 include

一般这种情况首先想到的肯定是写好布局,然后直接用到的地方include即可。那就来吧!

一般布局的头部可以分为三个模块,左中右,中间一般都是标题,所以直接放上TextView即可,左右有可能是文字也有可能是图片,所以两种都写上,上代码:


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_70"
    android:background="@color/colorAccent"
    android:orientation="vertical"
    android:paddingTop="@dimen/dp_20">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="UselessParent">
        <ImageView
            android:id="@+id/imgBack"
            android:layout_width="@dimen/dp_40"
            android:layout_height="match_parent"
            android:layout_centerVertical="true"
            android:paddingTop="@dimen/dp_14"
            android:paddingBottom="@dimen/dp_14"
            android:src="@drawable/img_back" />
        <ImageView
            android:id="@+id/imgRight"
            android:layout_width="@dimen/dp_40"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:paddingTop="@dimen/dp_14"
            android:paddingBottom="@dimen/dp_14"
            android:visibility="gone" />
        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="玩安卓"
            android:textColor="@color/white"
            android:textSize="@dimen/sp_18" />
        <TextView
            android:id="@+id/txtRight"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:paddingEnd="@dimen/dp_7"
            android:paddingStart="@dimen/dp_7"
            android:paddingTop="@dimen/dp_14"
            android:paddingBottom="@dimen/dp_14"
            android:textColor="@color/white"
            android:textSize="@dimen/sp_16"
            android:visibility="gone"
            tools:ignore="RtlSymmetry" />
    </RelativeLayout>
</FrameLayout>

写好头布局之后,直接在需要的地方进行include即可:

<include
        layout="@layout/layout_title"/>

如果需要进行修改标题名称或者添加点击事件的话直接进行添加即可。

第二种 自定义View

其实直接include也是可以的,但是千万要记住,程序猿这个物种是非常懒的,能坐着绝对不站着、能躺着绝对不坐着。。。。

所以。。。就连那几行代码都不想写,那就自定义个View吧,因为标题栏的操作一般只有设置标题、返回按钮和确定按钮,所以咱们还可以把设置标题和返回操作直接做好,就不需要每个页面再去写了。

第一步

好了,说干就干,自定义View的第一步是干啥啊?对,创建View 啊!

class TitleBar @JvmOverloads constructor(
    private val mContext: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : RelativeLayout(mContext, attrs, defStyleAttr), View.OnClickListener {}

第二步

上面咱们已经定义好了布局,这里就可以直接进行使用了,直接将布局加载进来进行使用就行:

init {
        initView()
    }
    /**
     * 初始化布局
     */
    private fun initView() {
        //加载布局
        View.inflate(mContext, R.layout.layout_title, this)
        //控制头布局,返回关闭页面
        mImgBack = findViewById(R.id.imgBack)
        //控制标题
        mTitleTv = findViewById(R.id.txtTitle)
        //右边图片
        mImgRight = findViewById(R.id.imgRight)
        //右边文字
        mTxtRight = findViewById(R.id.txtRight)
        mImgBack.setOnClickListener(this)
    }

第三步

好了,这基本已经完成了。很简单吧?但是需要的操作咱们还没干呢,上面说过,咱们需要给一个设置标题的接口:

标题已经设置好了,接下来就是关闭页面:

override fun onClick(v: View) {
        if (v.id == R.id.imgBack) {
            //关闭页面
            if (KeyboardUtils.isSoftInputVisible(mContext as Activity)) KeyboardUtils.hideSoftInput(this)
            mContext.finish()
        }
    }

这里除了关闭页面之外还加了一个操作:关闭输入法弹出框。

第四步

除了这些还要再预留一些接口,比如右边文字的设置以及点击操作、右边按钮的设置以及点击操作等等:

/**
     * 设置返回按钮图片
     *
     * @param imageId 图片id
     */
    fun setBackImage(imageId: Int) {
        if (imageId != 0) {
            mImgBack.setImageResource(imageId)
        }
    }
    /**
     * 设置返回按钮图片是否显示
     *
     * @param imageVisiable 是否显示
     */
    fun setBackImageVisiable(imageVisiable: Boolean) {
        if (imageVisiable) {
            mImgBack.visibility = View.VISIBLE
        } else {
            mImgBack.visibility = View.GONE
        }
    }
    /**
     * 设置右边图片
     *
     * @param imageId 图片id
     */
    fun setRightImage(imageId: Int) {
        if (imageId != 0) {
            require(mTxtRight.visibility != View.VISIBLE) { "文字和图片不可同时设置" }
            mImgRight.visibility = View.VISIBLE
            mImgRight.setImageResource(imageId)
        }
    }
    /**
     * 设置右边文字
     *
     * @param text 文字
     */
    fun setRightText(text: String?) {
        if (text != null) {
            require(mImgRight.visibility != View.VISIBLE) { "文字和图片不可同时设置" }
            mTxtRight.visibility = View.VISIBLE
            mTxtRight.text = text
        }
    }
    /**
     * 设置右边文字背景
     *
     * @param color 颜色
     */
    fun setRightBackColor(color: Int) {
        mTxtRight.setBackgroundColor(color)
    }
    /**
     * 设置右边文字禁止点击
     *
     * @param click 是否可以点击
     */
    fun setRightTextClick(click: Boolean) {
        mTxtRight.isClickable = click
    }
    fun setRightTextOnClickListener(onClickListener: OnClickListener) {
        mTxtRight.setOnClickListener(onClickListener)
    }
    fun setRightImgOnClickListener(onClickListener: OnClickListener) {
        mImgRight.setOnClickListener(onClickListener)
    }
1

使用

好了,写的差不多了,看看如何使用吧?

在需要使用的地方写上布局:

<com.zj.core.util.TitleBar
        android:id="@+id/articleListTitleBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

然后在页面中直接进行需要的操作即可,例如重新设置下标题,并且需要展示返回按钮:

articleListTitleBar.setTitle(keyword)
articleListTitleBar.setBackImageVisiable(true)

是不是很简单呢?

继续优化

刚才说了,程序猿都非常懒,即使封装成这样也是不行的,每个类都需要去代码中设置,直接在布局中写好不得了。。。

好,那就在布局中写好吧。。。。

首先需要在res->values中创建一个attrs.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

创建完成之后大概是这样的,然后加入咱们需要设置的操作:标题和返回按钮是否显示:

<declare-styleable name="TitleBar">
        <attr name="titleName" format="string" />
        <attr name="backImageVisiable" format="boolean" />
    </declare-styleable>

好了,这就完事了,下面在自定义View中找到进行使用即可:

private var titleName: String? = null
    private var backImageVisiable: Boolean? = null
    init {
        val attr = context.obtainStyledAttributes(attrs, R.styleable.TitleBar)
        titleName = attr.getString(R.styleable.TitleBar_titleName)
        backImageVisiable = attr.getBoolean(R.styleable.TitleBar_backImageVisiable,true)
    }

上面代码很简单,找到标题的文字和是否显示返回按钮的参数,因为有可能为空,所以初始值定为了null。下面在initView方法中进行判断使用:

if (titleName != null) {
            mTitleTv.text = titleName
        }
        if (backImageVisiable !=null){
            setBackImageVisiable(backImageVisiable!!)
        }

ok了,来试一下吧:

<com.zj.core.util.TitleBar
        android:id="@+id/userTitleBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleName="关于我"
        app:backImageVisiable="true"/>

好嘞,已经实现了咱们需要的基本功能了。

总结

本篇文章很简单,只是一个基本工具,大家可以在此之上多添加一些attrs中的值,多添加一些功能。

本文所有代码都在我写的一个MVVM的玩安卓的工具包中:https://github.com/zhujiang521/PlayAndroid/blob/master/core/src/main/java/com/zj/core/util/TitleBar.kt



目录
相关文章
|
2月前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
118 1
|
2月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
110 2
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
162 0
安卓项目:app注册/登录界面设计
|
25天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
49 6
|
2月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
55 5
|
2月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
47 2
|
2月前
|
开发工具 Android开发 iOS开发
Android vs iOS:构建移动应用时的关键考量####
本文深入探讨了Android与iOS两大移动平台在开发环境、性能优化、用户体验设计及市场策略方面的差异性,旨在为开发者提供决策依据。通过对比分析,揭示两个平台各自的优势与挑战,帮助开发者根据项目需求做出更明智的选择。 ####
|
3月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
2月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
54 4