安卓构建项目通用头部(功能完善)

简介: 安卓构建项目通用头部

实际项目中会有很多页面,而头布局大同小异,如果每个页面都写一遍的话代码太过冗余,所以建议将头布局抽取出来,做一个通用的自定义布局。


首先看一下写完的样式吧:

20191007162323592.png


第一步,先建立一个自定义布局,继承自RelativeLayout(布局文件跟布局是啥就继承啥):

/**
 * 自定义头部View
 *
 * @author jiang zhu on 2019/10/7
 */
public class TitleBar extends RelativeLayout{
    public TitleBar(Context context) {
        this(context, null);
    }
    public TitleBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public TitleBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

第二步,写一个通用的布局文件。这里有两种加载方式,可以直接通过new布局之后add View的方式来添加,但是由于添加的布局过多,所以我这里直接建了一个布局文件:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="@color/colorPrimary"
    android:orientation="vertical"
    android:paddingTop="20sp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="UselessParent">
        <ImageView
            android:id="@+id/imgBack"
            android:layout_width="40dp"
            android:layout_height="match_parent"
            android:layout_centerVertical="true"
            android:contentDescription="@string/app_name"
            android:paddingBottom="14dp"
            android:paddingTop="14dp"
            android:src="@drawable/icon_back"
            android:visibility="gone" />
        <ImageView
            android:id="@+id/imgRight"
            android:layout_width="40dp"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:layout_marginEnd="5dp"
            android:paddingBottom="14dp"
            android:paddingTop="14dp"
            android:contentDescription="@string/app_name"
            android:visibility="gone" />
        <TextView
            android:id="@+id/txtTitle"
            style="@style/txt_titleStyle1"
            android:layout_centerInParent="true"
            android:text="@string/app_name" />
        <TextView
            android:id="@+id/txtLeft"
            style="@style/txt_titleStyle1"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:layout_marginStart="10dp"
            android:text="@string/app_name"
            android:textSize="15sp"
            android:visibility="gone" />
        <TextView
            android:id="@+id/txtRight"
            style="@style/txt_titleStyle1"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:layout_marginEnd="10dp"
            android:textSize="16sp"
            android:visibility="gone" />
    </RelativeLayout>
</LinearLayout>


第三步,将布局加载进咱们的自定义布局中:

//加载布局
inflate(mContext, R.layout.layout_title, this);

第四步,将布局中的控件findViewById,之后会有用:


private Context mContext;
    private TextView mTitleTv;
    private ImageView mImgBack;
    private ImageView mImgRight;
    private TextView mTxtRight;
 /**
     * 初始化布局
     */
    private void initView() {
        //加载布局
        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);
    }

第五步,布局大部分都有返回按钮,如果每个布局都重写,然后设置finish()的话,那就太多了,所以说直接设置好返回按钮的点击事件即可:


@Override
    public void onClick(View v) {
        if (v.getId() == R.id.imgBack) {
            //关闭页面
            ((Activity) mContext).finish();
        }
    }

第六步,大家可以看到,在布局中我把返回按钮设为了GONE,所以默认是不显示的,如果需要显示的话还得修改布局,太麻烦了,所以抽出一个公共的方法:


/**
     * 设置返回按钮图片是否显示
     *
     * @param imageVisiable 是否显示
     */
    public void setBackImageVisiable(boolean imageVisiable) {
        if (imageVisiable){
            mImgBack.setVisibility(VISIBLE);
        }else {
            mImgBack.setVisibility(GONE);
        }
    }

第七步,每个页面的标题肯定不一样,所以标题肯定需要修改:

/**
     * 设置标题栏标题
     *
     * @param title 标题
     */
    public void setTitle(String title) {
        mTitleTv.setText(title);
    }

第八步,我们也许需要修改返回图片:


/**
     * 设置返回按钮图片
     *
     * @param imageId 图片id
     */
    public void setBackImage(int imageId) {
        if (imageId!=0){
            mImgBack.setImageResource(imageId);
        }
    }

第九步,设置其他参数的设置方法:


/**
     * 设置返回按钮图片是否显示
     *
     * @param imageVisiable 是否显示
     */
    public void setBackImageVisiable(boolean imageVisiable) {
        if (imageVisiable){
            mImgBack.setVisibility(VISIBLE);
        }else {
            mImgBack.setVisibility(GONE);
        }
    }
    /**
     * 设置右边图片
     *
     * @param imageId 图片id
     */
    public void setRightImage(int imageId) {
        if (imageId!=0){
            if (mTxtRight.getVisibility() == VISIBLE){
                throw new IllegalArgumentException("文字和图片不可同时设置");
            }
            mImgRight.setVisibility(View.VISIBLE);
            mImgRight.setImageResource(imageId);
        }
    }
    /**
     * 设置右边文字
     *
     * @param text 文字
     */
    public void setRightText(String text) {
        if (text!=null){
            if (mImgRight.getVisibility() == VISIBLE){
                throw new IllegalArgumentException("文字和图片不可同时设置");
            }
            mTxtRight.setVisibility(View.VISIBLE);
            mTxtRight.setText(text);
        }
    }


好了,基本上就是这样了,咱们来看一下调用的方式吧:在布局中添加咱们的自定义View:


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <com.zj.titlebar.TitleBar
        android:id="@+id/mainTb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="对话框"
        android:onClick="createDialog"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>


然后直接在使用的地方进行设置即可:


private void initView() {
        mainTb = findViewById(R.id.mainTb);
        mainTb.setTitle("我爱你");
    }


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