Android:日常学习笔记(7)———探究UI开发(4)

UI概述

 View 和 ViewGrou

  Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成View 对象用于在屏幕上绘制可供用户交互的内容。ViewGroup 对象用于储存其他 View(和 ViewGroup)对象,以便定义界面的布局。

  

说明:

  View是安卓中最基本的一种UI,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,我们使用的各种控件都是在View的基础上进行的添加和完善。ViewGroup则是一种特殊的View,他可以包含很多View和子ViewGroup,是一个用于放置控件和布局的容器。

引入布局

  比如现在我们要替换系统默认的标题栏,改为如下所示:

  

  即两边是两个按钮,中间是标题文字,XML配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/colorPrimary"><ImageButtonandroid:layout_width="wrap_content"android:layout_height="match_parent"android:src="@drawable/previous_24px"/><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1"android:gravity="center"android:text="我是标题文字"android:textColor="#fff"android:textSize="24sp" /><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/next_24px"/>
</LinearLayout>

  我们面临一个问题,我们要让所有的活动页面都采用这个标题栏该怎么做呢?

   我们可以单独将这个标题栏写到一个XML文件中,然后在其他任意使用此标题栏的活动的布局文件中引入此XML即可

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"> <include layout="@layout/panel_title"/>
</LinearLayout>

创建自定义控件

说明:

  引入布局的技巧的确实解决了重复编写布局代码的问题,但是如果布局中的一些控件要求能够响应事件,我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码,比如标题栏中的返回按钮,都是销毁当前活动。为了避免重复代码,我们可以使用自定义控件的方式来解决。

代码:

  1.新建TitleLayout(继承自LinearLayout)

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, @Nullable AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.panel_title,this);}
}

说明:

    首先我们重写了LinerLayout的构造函数,在布局中引入TitleLayout控件就会调用这个构造函数。然后在构造函数中对标题栏布局进行动态加载,这就需要用到LayoutInflater了。通过LayoutInflater的form()方法可以构建出一个LayoutInflater对象,然后调用Inflate()就可以动态加载一个布局文件。

  inflate接受两个参数:

  •   第一个是布局文件的ID
  •   第二个参数是给加载好的布局再添加一个父布局,此处为this

  2.为按钮绑定事件

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, @Nullable AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.panel_title,this);ImageButton titleBack = (ImageButton) findViewById(R.id.title_back);titleBack.setOnClickListener(new OnClickListener() {public void onClick(View v) {Toast.makeText(getContext(),"活动销毁",Toast.LENGTH_LONG).show();}});}
}

  3.在布局文件中添加这个自定义控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent">
    <com.example.zy.dealhelper.TitleLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>

说明:

  添加自定义控件和添加普通控件的方式基本一样,只不过在添加自定义控件的时候需要指明控件的具体类名。

  

转载于:https://www.cnblogs.com/MrSaver/p/6882693.html

Android:日常学习笔记(7)———探究UI开发(4)相关推荐

  1. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  2. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  3. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  4. 安卓开发Android studio学习笔记12:读取解析XML(案例演示)

    Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...

  5. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  6. 疯狂Android讲义 - 学习笔记(二)

    疯狂Android讲义 - 学习笔记(二) Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.androi ...

  7. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  8. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  9. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  10. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

最新文章

  1. HealthKit开发教程之HealthKit的辅助数据
  2. c mysql 内存泄露_c代码连接mysql数据库内存泄露的问题
  3. 2接口详解_TS入门笔记2——TS接口进阶详解
  4. gradle 的 依赖管理(八)
  5. iview中嵌套使用tabs注意事项
  6. 《软件需求分析(第二版)》第 15 章——变更管理 重点部分总结
  7. RESTful开发风格
  8. 服务器不删档的设置_CCD2服务器已经开启,准备好刷刷刷了吗
  9. mac os android连接wifi密码,Mac使用小技巧:找回WiFi密码
  10. 【推荐】JSON在线格式化工具
  11. 理解Java主函数中的String[] args
  12. (超全)全面手动清理c盘的的步骤
  13. 设计模式(一)——统一建模语言基础知识
  14. .ico 图标下载网站推荐
  15. MongoDB索引原理
  16. python中binomial_Python Numpy random.binomial() 二项分布
  17. OSM和PBF数据格式说明
  18. 2021-06-10
  19. 【- Flutter 桌面篇 -】 FlutterUnit win版闪亮登场
  20. python特殊变量方法 不懂_Python中的常见特殊方法—— del方法

热门文章

  1. 数值的整数次方(代码的完整性)
  2. 十款大名鼎鼎的开源软件
  3. 使用srvany.exe把程序安装成windows服务的方法
  4. 在Windows上删除所有的Oracle安装 和电脑名改变后的设置...
  5. 多线程环境下,HashMap 为什么会出现死循环?
  6. 看了Google大神Jeff Dean的传说后,我跪了!这才是真的大神
  7. [译]使用深度学习方法实现面部表情包识别
  8. 阿里系多个产品线宕机,包括1688、淘宝、天猫、淘宝直播、闲鱼……
  9. 《算法图解》第八章贪婪算法
  10. TP5整合的阿里云短信接口