Android 设置顶部的内容

2023-05-16

目录

  • 想说的话
  • 实现
    • 实现一个自定义控件。
    • 他的自定义属性。
    • Actviity 设置右侧的icon
    • fragment 中 设置

想说的话

这里遇到一个问题就是设置抽取出来一个类似与以下的标题内容,自己忽然发现之前的时候没有完全理解,所以自己记录一下,之后再次深入理解。
在这里插入图片描述

实现

首先我们要知道顶部左侧图标 中间文字,右侧图标的特别常见,所以我们先将这个抽取出来。

实现一个自定义控件。


import android.annotation.SuppressLint
import android.content.Context
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import com.chaunzhi.chuanzhi.R

class TitleView : ConstraintLayout {
    private var tbTitle: Toolbar? = null
    private var tvContent: TextView? = null
    private var tvRight: TextView? = null
    private var viewLine: View? = null
    private var contentName: String? = null
    private var rightName: String? = null
    private var contentSize: Float? = null
    private var rightSize: Float? = null
    private var contentWidth: Float? = null
    private var rightWidth: Float? = null
    private var contentColor: Int? = null
    private var rightColor: Int? = null
    private var lineColor: Int? = null
    private var titleLeftIcon: Int? = null
    private var contexts: Context? = null

    constructor(context: Context) : this(context, null)

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)

    @SuppressLint("Recycle")
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        val typeArray =
            context.obtainStyledAttributes(attrs, R.styleable.TitleView)

        contentName = typeArray.getString(R.styleable.TitleView_content_name)

        rightName = typeArray.getString(R.styleable.TitleView_right_name)
        contentSize = typeArray.getDimension(R.styleable.TitleView_content_size, 15.0f)
        rightSize = typeArray.getDimension(R.styleable.TitleView_rights_size, 15.0f)
        contentColor = typeArray.getColor(
            R.styleable.TitleView_content_color,
            resources.getColor(android.R.color.black)
        )
        rightColor = typeArray.getColor(
            R.styleable.TitleView_rights_color,
            resources.getColor(android.R.color.black)
        )
        lineColor = typeArray.getColor(
            R.styleable.TitleView_line_color,
            resources.getColor(R.color.dividing_color)
        )
        contentWidth = typeArray.getDimension(R.styleable.TitleView_content_width, 0.0f)
        rightWidth = typeArray.getDimension(R.styleable.TitleView_right_width, 0.0f)
        titleLeftIcon = typeArray.getResourceId(
            R.styleable.TitleView_title_left_icon,
            R.drawable.left_icon
        )
        inints(context)
    }


    private fun inints(context: Context) {
        contexts = context
        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val view = inflater.inflate(
            R.layout.title_view, this, true
        )
        // 包裹的Toolbar
        tbTitle = view.findViewById(R.id.tb_title)
        // 内容
        tvContent = view.findViewById(R.id.tv_title_content)
        // 右侧的
        tvRight = view.findViewById(R.id.tv_title_right)
        // 下方的横线
        viewLine = view.findViewById(R.id.view_title_line)
        tvContent?.text = contentName
        tvRight?.text = rightName
        tvContent?.paint?.textSize = contentSize as Float
        tvRight?.paint?.textSize = rightSize as Float
        val contentLayoutparams = tvContent?.layoutParams
        contentLayoutparams?.width = contentWidth?.toInt()
        tvContent?.layoutParams = contentLayoutparams
        val rightLayoutparams = tvRight?.layoutParams
        rightLayoutparams?.width = rightWidth?.toInt()
        tvRight?.layoutParams = rightLayoutparams
        tvContent?.setTextColor(contentColor as Int)
        tvRight?.setTextColor(rightColor as Int)
        viewLine?.setBackgroundColor(lineColor as Int)
        tbTitle?.setNavigationIcon(titleLeftIcon as Int)


    }

    fun setContentsName(contentName: String) {
        tvContent?.text = contentName
    }

    fun setRightsName(rightName: String) {
        tvRight?.text = rightName
    }

    fun setLeftIcon(leftIcon: Drawable) {
        tbTitle?.navigationIcon = leftIcon
    }

    fun setLeftIcon(leftIcon: Int) {
        tbTitle?.setNavigationIcon(leftIcon as Int)
    }

    fun setNavigationOnClickListener(listener: OnClickListener) {
        tbTitle?.setNavigationOnClickListener(listener)
    }

    fun getToolbar(): Toolbar {
        return tbTitle as Toolbar
    }

}

他的自定义属性。

在 res / values/ 创建一个名叫attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TitleView">
        <attr name="content_name" format="string" />
        <attr name="right_name" format="string" />
        <attr name="content_size" format="dimension" />
        <attr name="rights_size" format="dimension" />
        <attr name="content_color" format="color" />
        <attr name="rights_color" format="color" />
        <attr name="line_color" format="color" />
        <attr name="content_width" format="dimension" />
        <attr name="right_width" format="dimension" />
        <attr name="title_left_icon" format="reference" />
    </declare-styleable>
    </resources>

Actviity 设置右侧的icon

这里哦大家可能就要问了,这些知识这只左侧的图标和居中的标题啊,还缺少右侧的图标。
这里我们可以使用Android 的 onCreateOptionsMenu 的 方法。
如果在 Actvitiy 进行使用

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        // inflate 的参数:
        // @MenuRes int menuRes 一个 menu 
        // Menu menu: 使用上方的 menu 就可以了
        menuInflater.inflate(R.menu.home_right_menu, menu)
        return true
    }

需要注意的是

  1. 如果要使用 onCreateOptionsMenu 一定要将自己的theme 主题设置为false ,当然默认为 false。
<item name="windowNoTitle">false</item>
  1. 在 oncreate 的方法中添加 这句话,否则的话左侧会出现设置的 label。(如果在Activity 中 没有设置,那么会使用Application 中设置的)
 supportActionBar?.setDisplayShowTitleEnabled(false)

fragment 中 设置

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater?.inflate(R.menu.home_right_menu, menu)
    }

在 fragment 中需要注意的也是几点:

  1. 在 fragment 的onCreate 方法中设置
  setHasOptionsMenu(true)
  1. 在 Actviity 和 Fragment 中都设置
    Activity 中设置
   supportActionBar?.setDisplayShowTitleEnabled(false)

Fragment 中设置

  (activity as AppCompatActivity).supportActionBar?.setDisplayShowTitleEnabled(false)
  1. 不需要规定Activity 是不是 windowNoTitle 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 设置顶部的内容 的相关文章

  • Firebase 管理 SDK Android

    在 Android 中初始化 Firebase Admin SDK 的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedIns
  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • GCM 向主题发送消息:TOO_MANY_TOPICS 错误

    以前 GCM 每个应用程序有 100 万个主题订阅的限制 我发现他们现在已经取消了这一限制 基于发布 订阅模型 主题消息支持 每个应用程序无限订阅 https developers google com cloud messaging to
  • 检测到设备正在振动?

    我使用下面的代码来振动设备 public void vibrator try Vibrator vibrator Vibrator getSystemService Context VIBRATOR SERVICE vibrator vib
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • Android 版 Robotium - solo.searchText () 不起作用

    我在使用 Robotium 时遇到 searchText 函数问题 我正在寻找这个字符串
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序

随机推荐

  • 2 计算机网络性能指标

    文章目录 速率带宽吞吐量时延时延带宽积往返时间网络利用率 速率 连接在计算机网络上的主机在数字信道上传送数据位数的速率 xff0c 也称为data rate或bit rate 单位是b s kb s Mb s Gb s 比特 xff08 b
  • Spring之IOC概念

    一 什么是IOC 1 IOC就是控制反转 xff0c 把对象创建和对象之间的调用过程交给Spring进行管理 2 使用IOC目的 之前我们创建对象的方式都是用new的方式创建 xff0c 这个方式有个缺点 xff0c 被创建对象的类的位置一
  • Spring之IOC操作Bena-XML配置文件

    一 什么是操作Bena管理 Bean管理指的是两个操作 1 Spring创建对象 2 Spring注入属性 二 Bean管理操作xml配置文件方式实现 1 基于xml方式创建对象 创建对象的时候默认执行无参构造方法 例 xff1a lt X
  • Spring之IOC操作Bena-XML注入其他类型属性值

    一 字面量 1 注入空值 lt 利用null标签将name属性设置为空值 gt lt property name 61 34 name 34 gt lt null gt lt property gt 2 注入属性包含特殊符号 方法一 xff
  • Spring之AOP

    目录 1 AOP基本概念 2 AOP底层原理 3 AOP相关术语 4 Spring中AOP操作 5 AOP操作 AOP注解 6 AOP操作 AOPXML配置 1 AOP基本概念 1 面向切片 xff08 方面 xff09 编程 xff0c
  • MyBatis-逆向工程

    正向工程 xff1a 先创建Java实体类 xff0c 由框架负责根据实体类生成数据库表 Hibernate是支持正向工程 的 逆向工程 xff1a 先创建数据库表 xff0c 由框架负责根据数据库表 xff0c 反向生成如下资源 xff1
  • Spring Boot-配置文件yaml

    1 配置文件类型 properties xff1a key 61 valueyaml xff1a key xff1a 空格 value 2 基本语法 key value xff1b kv之间有空格大小写敏感使用缩进表示层级关系缩进不允许使用
  • JDK、JRE、JVM

    JDK与JRE JDK gt J ava D evelopment K it Java开发工具包 JDK是提供给Java开发人员使用的 xff0c 其中包含了Java的开发工具 xff0c 也包括了JRE 开发工具 xff1a 编译工具 j
  • Redis-概述

    1 什么是Redis xff1f Redis Re mote Di ctionary S erver 远程字典服务器 xff0c 是开源的 xff0c 使用c语言编写的 xff0c 是基于内存的高性能的Key Value数据库 作者 ant
  • HTML点击刷新验证码

    HTML点击刷新验证码 之前的代码 span class token tag span class token tag span class token punctuation lt span div span span class tok
  • 基于java的小区物业报修管理系统

    本毕业设计课题是基于JAVAEE的小区物业报修管理系统 xff0c 以计算机为操作工具 xff0c MyEclipse为开发平台 mysql为后台数据库 系统开发将采用MVC模式 xff0c 实现对物业报修管理和报修服务评价管理等功能 xf
  • 3 物理层 数据通信基础知识 奈氏准则与香农定理 物理层传输介质 信道复用技术

    文章目录 1 物理层基本概念2 数据通信的基础知识2 1 典型的数据通信系统模型2 2 与通信相关的几个术语2 3 有关信道的几个概念2 4 基带 baseband 信号和带通 band pass 信号2 5 几种最基本的调制方法2 6 网
  • Android Studio 关于BottomNavigationView 无法预览视图的三种常规解决方法

    最近在使用底部导航栏 BottomNavigationView 时 xff0c 应用能正常运行 xff0c 但右侧Split Design无法显示预览视图 xff0c 很不方便 xff0c 查阅大量资料后 xff0c 得到了两种主流解决方案
  • ubuntu分辨率异常问题

    当ubuntu分辨率出现不正常情况时 xff0c 可能有两种现象 xff1a 当出现整体图标都偏大或者偏小的问题时 xff0c 可能是由于分辨率设置异常 如果存在响应的分辨率进行设置即可 xff0c 如果不存在则使用xrandr进行添加 x
  • VR版“半条命”大火,VR游戏迎来消费级市场的春天?

    彼之砒霜 xff0c 汝之蜜糖 2020年的艰难开局 xff0c 在让众多行业陷入困顿之际 xff0c 却让游戏业迎来了一场流量的盛宴 除了日进斗金的王者 吃鸡 xff0c 还有火爆朋友圈的动森 xff0c 一款3A级VR游戏 Half L
  • 读懂海尔智家大脑:深度体验的本质是深度生活

    了解科技行业的读者 xff0c 应该都对 大脑 这个名词不陌生 黑灯工厂 里指挥生产的 工业大脑 xff0c 繁忙机场里运筹帷幄的 航空大脑 xff0c 还有智慧城市建设的灵魂 城市大脑 如果家也有一颗总揽全局的大脑 xff0c 生活会发生
  • ubuntu 安装包报:下列软件包有未满足的依赖关系:

    root 64 ubuntu usr src linux 5 0 1 apt install zlib1g dev 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有一些软件包无法被安装 如果您用的是 unst
  • vSphere虚拟化之ESXi安装及部署

    vSphere虚拟化之ESXi安装及部署 1 安装ESXi2 步骤 vClient的安装及连接3 使用VMware VSphere Client远程安装虚拟机 1 安装ESXi 安装环境 xff1a 用VMware安装ESXi 6 0一台虚
  • Flutter 学习之DIO封装

    简介 xff1a 需要导入的库 dio 3 0 9 json serializable 3 3 0 dio cookie manager 1 0 0 dio http cache 0 2 6 介绍 xff1a 在自己的这个封装中集成了 显示
  • Android 设置顶部的内容

    目录 想说的话实现实现一个自定义控件 他的自定义属性 Actviity 设置右侧的iconfragment 中 设置 想说的话 这里遇到一个问题就是设置抽取出来一个类似与以下的标题内容 自己忽然发现之前的时候没有完全理解 xff0c 所以自