【Android】实现自定义标题栏
不知不觉标题自定义标题栏这个功能已经写了有将近半年的时间了,总共花了一个来月的下班时间才将其完成,完全靠自己的开发的确有点难,但,说实在的也不难,当初觉得难是因为自己对自定义的View点击事件一窍不通,翻了许多博客,迟迟未找到处理方法,直到后面脑子换了种思路去思考这个问题,才将其处理掉。
自定义标题栏,就要隐藏掉自带的标题栏,隐藏标题栏只需要在AndroidManifest.xml文件的application标签theme的引用样式的父样式更换为有NoActionBar字样的即可
标题栏隐藏了,好,我们正式开始进入
新建一个class继承一个相对布局并重写其构造方法
public class CustomTitleBlock extends RelativeLayout {public CustomTitleBlock(Context context) {super(context);}public CustomTitleBlock(Context context, AttributeSet attrs) {super(context, attrs);}public CustomTitleBlock(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public CustomTitleBlock(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);} }创建一个Layout文件用于CustomTitleBlock.class绑定并初始化相关控件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/layout_title"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="12dp"android:layout_marginRight="12dp"><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/left"android:layout_width="wrap_content"android:layout_height="match_parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"><ImageViewandroid:id="@+id/iv_left"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_left"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toRightOf="@+id/iv_left"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout><TextViewandroid:id="@+id/tv_centent"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textStyle="bold"android:textSize="16sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"/><EditTextandroid:id="@+id/search_box"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_marginTop="4dp"android:layout_marginBottom="4dp"android:textSize="14sp"android:background="@drawable/search_box_style"android:drawableLeft="@drawable/search_64"android:drawablePadding="6dp"android:paddingLeft="8dp"android:paddingRight="8dp"android:visibility="invisible"app:layout_constraintLeft_toRightOf="@+id/left"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintRight_toLeftOf="@+id/right"/><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/right"android:layout_width="wrap_content"android:layout_height="match_parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintRight_toRightOf="parent"><TextViewandroid:id="@+id/tv_right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintRight_toLeftOf="@+id/iv_right"/><ImageViewandroid:id="@+id/iv_right"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout></androidx.constraintlayout.widget.ConstraintLayout></RelativeLayout>在values文件夹下创建一个attrs.xml文件用于声明控件的属性
<?xml version="1.0" encoding="utf-8"?> <resources><declare-styleable name="CustomTitleBlock"><!-- 标题栏左边 --><attr name="leftText" format="string"/><attr name="leftTextColor" format="color"/><attr name="leftTextSize" format="integer"/><attr name="leftImage" format="reference"/><!-- 标题栏中间 --><attr name="centerText" format="string"/><attr name="centerTextColor" format="color"/><attr name="centerTextSize" format="integer"/><!-- 搜索框 --><attr name="searchBox" format="boolean"/><attr name="searchBoxHint" format="string"/><attr name="searchBoxWidth" format="dimension"><enum name="match_parent" value="-1"/><enum name="wrap_content" value="-2"/></attr><!-- 标题栏右边 --><attr name="rightText" format="string"/><attr name="rightTextColor" format="color"/><attr name="rightTextSize" format="integer"/><attr name="rightImage" format="reference"/></declare-styleable> </resources>接下来我们可以通过Context.obtainStyledAttributes方法绑定attrs文件的declare-styleable属性,返回的TypedArray可以获得declare-styleable属性的索引
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTitleBlock, defStyleAttr, 0);因为我设置的declare-styleable属性不止一条,需要使用循环来进行遍历,通过遍历来获得相对应的属性
for (int i = 0; i < count; i++) {int attr = typedArray.getIndex(i);switch (attr) {case R.styleable.CustomTitleBlock_leftText:// 此处写该属性赋值后的逻辑应该进行什么样的操作break;case R.styleable.CustomTitleBlock_leftTextColor:// 此处写该属性赋值后的逻辑应该进行什么样的操作break;} } // 循环完要记得回收 typedArray.recycle();其中,R.styleable.CustomTitleBlock_leftText 中,下划线前面指的是在values目录下创建的attrs文件里面的 declare-styleable ,下划线后面指的是该 declare-styleable 下的 attr
还需要在layout文件引用就可以看见效果啦
光有效果还不行,触发事件还没有,无疑是摆设,自定义的控件点击事件并不难,声明几个公共方法去实现即可
至此,自定义标题栏已完成,有不懂的可以下载文件观看哦-点击下载本文代码
总结
以上是生活随笔为你收集整理的【Android】实现自定义标题栏的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 潮位分析中高低潮位数据的处理
- 下一篇: Android Uri的几种使用方法,