Android学习笔记之UI开发

(学习参考书:第一行代码第2版)

一、所有控件适用的属性

android:id 给当前控制定义一个唯一的标识符
android:text 控件上显示的内容
android:layout_width 所有Android控件的共有属性,指定控件的宽度
android:layout_height 所有Android控件的共有属性,指定控件的高度

宽度和高度的可选值有两种:
match_parent 当前的控件的大小与父布局的大小相同(铺满)
warp_content 当前控件大小刚好包括自己所含的内容(自适应)
除此之外,可以对控件指定宽和高,但是容易在不同设备上出现适配问题

android:visibility 所有Android控件的共有属性,指定控件是否可见;可选值有三种:
visible 表示控件可见,为默认属性。
invisible 表示控件不可见,但是它仍然占据原来的位置和大小,可以理解为透明状态。
gone 表示控件不仅不可见,还不再占用任何屏幕空间
控件的可见性还可以在Java代码中通过setVisibility()方法控制,传入View.VISIBLE、View.INVISIBLE、View.GONE三种值。

二、常用控件及其适用方法

(1)TextView
文本框,用于在界面上显示一段文本信息。

android:gravity指定文字的对齐方式,可选值有top、bottom、left、right、center等,可以使用|间隔来同时指定多个值。
android:textSize 指定文字的大小,Android重字体大小使用sp作为单位
android:textColor 指定该文字的颜色

(2)Button
按钮,可以注册监听器响应点击事件;是与用户交互的一个重要的控件

android:textAllCaps=false”可以关闭默认的大写锁定
通过调用setOnClickListener(new View.OnClickListener)方法实现匿名类然后重写onClick方法便可以决定点击该按钮触发的事件。也可以通过实现接口View.OnClickListener的方式进行注册。

(3)EditText
编辑框,和用户进行交互的一个重要组件,允许用户在组件里输入和编辑内容,并且程序对这些内容进行处理。

android:hint 编辑框的提示性文字,一经输入便消失
android:maxLines 决定编辑框随着文字的增多拉长的最大行数
通过editView.getText().toString()方法可以获取编辑框的内容

(4)ImageView
在界面上用于展示图片的一个控件,使用该控件需要在res/drawable目录下存放图片

android:src指定drawable目录下的图片。
通过imageView.setImageResource(R.drawable.name)方法可以修改图片
android:clickable 设置为true后,该图片能响应点击事件。

(5)ProgressBar
该控件用于在界面上显示一个进度条,表示是我们的程序正在加载一些数据。
ProgressBar可以设定不同的样式,默认为圆形;通过style属性可以将其设定为水平进度条。

style=?android:attr/progressBarStyleHorizontal” //水平进度条
android:max=100//满进度为100

(6)AlertDialog
在当前界面弹出对话框,该对话框置顶于所有界面元素之上,能够屏蔽掉其他控件的交互能力,因此AlertDialog常用于提示重要的内容或者警告信息。使用方法如下:

  • 首先使用AlertDialog.Builder创建一个AlertDialog的实例
  • 然后为这个对话框设置标题、内容、可否用back键关闭对话框
  • 调用setPositiveButton()方法设置对话框的确定按钮的点击事件
  • 调用setNegativeButton()方法设置对话框的取消按钮的点击事件
  • 最后调用show()方法将对话框显示出来

(7)ProgressDialog
在界面弹出一个对话框,并且屏蔽掉其他控件的交互能力。但是ProgressDialog区别于AlertDialog的是会在对话框中显示一个进度条。
操作方式与AlertDialog类似。

三、五种基本布局

布局可以使界面内的多个控件美观的排布到布局上,并且通过多层布局的嵌套可以实现复杂的界面。
(1)线性布局LinearLayout
该布局会将它所包含的控件在线性方向上依次排列

android:orientation 指定排列方向vertical(竖直),horizontal(水平)
注意,如果LinearLayout的排列方向是horizontal,那么控件的宽不能设置为match_parent;同理,vertical时高度不能设置为match_parent。

android:layout_gravity 用于指定控件在布局中的对齐方式。当为horizontal时,只有垂直方向上的对齐方式才会生效;vertical时,水平方向上的对齐方式才会生效。

android:layout_weight 允许使用比例的方式指定控件的大小,适配型很强。引号中写数字,最后该控件所占比例即为本数字/总数字

android:layout_marginTop 与上边界隔开一定的距离

(2)相对布局RelativeLayout
通过相对定位的方式让控件出现在布局的任何位置。常用属性:

android:layout_alignParentLeft 设置为true时,控件位于左
android:layout_alignParentRight 设置为true时,控件位于右
android:layout_alignParentTop 设置为true时,控件位于顶
android:layout_alignParentBotton 设置为true时,控件位于底
android:layout_centerInParent 设置为true时,控件位于中
android:layout_above 设置为其他控件id,位于其上方
android:layout_below设置为其他控件id,位于其下方
android:layout_toLeftOf设置为其他控件id,位于其左方
android:layout_toRightOf设置为其他控件id,位于其右方

(3)帧布局FrameLayout
所有控件都默认设置在布局的左上角,按照先后顺序覆盖。可以通过

扫描二维码关注公众号,回复: 13110537 查看本文章
android:layout_gravity指定对齐方式。

(4)百分比布局
百分比布局是对帧布局和相对布局的优化,分为PercentFrameLayout和PercentRelativeLayout两种。通过直接指定控件在布局中的百分比,达到任意比例分割布局的目的。
百分比是新增布局,为了让其在所有Android版本上使用,需要在app/build.gradle文件的dependencies闭包下添加:

implementation ‘androidx.percentlayout.percentlayout:1.0.0

百分比布局不是内置在SDK当中的,所以是使用时需要写出完整包路径且定义一个app的命名空间:

androidx.percentlayout.widget.PercentFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

app:layout_widthPercent 将控件的宽度指定为布局的n%
app:layout_heightPercent 将空间的高度指定为布局的n%

百分比布局会继承原布局的特性。

(5)约束布局ConstraintLayout
官方推荐的,默认的布局方式。采用可视化拖拽组件的形式在界面上布局。
控件和容器、控件和控件之间可以添加约束,实现相对定位。

Autoconnect 可以根据拖放控件的状态自动判断如何添加约束,但只局限于当前的对单个控件的操作
Inference 把所有控件拖放好后,一键添加他们之间的约束关系

四、创建自定义控件

所有的空间都是直接或间接的继承自View,所用的布局都是直接或间接的继承自ViewGroup。View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件。

(1)引入布局
如果直接在res/layout下创建的布局文件,可以在对应活动的布局文件中引入:

<include layout=@layout/name”/>

使用这种方式,不管有多少布局需要添加标题栏,只需一行include语句就可以了。

隐藏系统自带标题栏的方法:

ActionBar actionBar = getSupportActionBar();
actionBar.hide();

(2)创建自定义控件
创建自定义控件的步骤:

  1. 新建一个Java类,让其继承自定义控件的布局类型。
  2. 首先重写继承的类的构造函数,然后在构造函数中实现需要对自定义控件布局的动态加载的方法:LayoutInflater。
  3. LayoutInflater的from()方法可以构建一个LayoutInflater对象。然后调用inflate()方法就可以动态加载一个布局文件。该方法接受两个参数:第一个是布局文件的id,第二个是给加载好的布局添加一个父布局。

使用自定义控件的步骤:
在需要添加该控件的活动的布局文件中指明控件的完整类名,包名不可省略。其余跟添加普通控件一样。

五、ListView控件

ListView是Android中最常用的控件,几乎所有的应用程序都会用到它。当程序中有大量的数据需要展示的时候,就可以借助ListView来实现。ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据会滚出屏幕。

(1)ListView的简单用法

  1. 在布局中添加ListView控件时只需先指定一个id,然后将宽度和高端全设置为match_parent,让其占满整个布局的空间。
  2. 数据无法直接传递给ListView,需要借助适配器来完成(例如ArrayAdapter)。ArrayAdapter通过泛型指定适配的数据类型,然后在构造函数中把要适配的数据传入。
  3. 最后调用ListView的setAdapter()方法,将创建好的适配器对象传递进去,如此一来,ListView和数据的关联就建立起来了。

(2)定制ListView的界面

  1. 定义一个实体类,作为ListView适配器的适配类型。
  2. 然后为ListView的子项定义一个自定义布局,新建layout
  3. 创建一个自定义的适配器,适配器可继承ArrayAdapter,并将泛型设置为第一步定义的实体类。在该类中重写父类的构造函数和getView()方法。
    getView() 该方法在每个子类被滚动到屏幕内时会被调用。在该方法中通过getItem()获得自定义实体类的实例,然后使用LayoutInflater来为这个子项加载布局。
  4. 然后使用相同方法创建适配器,传入对应参数,传递数据。

(3)提升ListView的运行效率
因为在FruitAdapter的getView()方法中,每次都将布局重新加载了一遍,当ListView快速滚动时,会成为性能的瓶颈。
getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便以后可以重用。
将重写的getView方法中的获取view的方式改为:

View view;
if(convertView==null){
    
    
    view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}else{
    
    
    view = convertView;
}

即可大大提高ListView的运行效率。当前的代码还可以通过新增一个内部类ViewHolder用于对控件的实例的缓存。用View的setTag()和getTag()方法将ViewHolder存取在View中,这样就没有必要每次通过findViewById()方法来获取控件实例了。

(4)ListView的点击事件
在活动中调用ListView对象的setOnItemClickListener方法,并在该方法参数表中新建内部类AdapterView.OnItemClickListener()重写其onItemClick方法,响应相应点击事件。

六、RecyclerView控件

Android提供了一个更强大的滚动控件RecyclerView。不仅可以实现ListView的效果,还优化了很多不足。
(1)RecyclerView基本用法

  1. 在布局中加入RecyclerView控件,指定一个id,宽度和高度都设为match_parent。
  2. 为RecyclerView准备一个适配器,新建一个类继承RecyclerView.Adapter,并将泛型指定为新建类名.ViewHolder。ViewHolder是在该类中定义的内部类。
  3. 继承的RecyclerView.Adapter,就必须重写三个方法:
onCreateViewHolder() 用于创建ViewHolder实例,在这个方法中加载RecyclerView的子布局,返回加载了布局的ViewHolder

onBindViewHolder() 用于对RecyclerView的子项的数据进行赋值的,会在每个子项滚动到屏幕内时调用,通过position参数得到当前项的新建类实例。然后再将数据设置到ViewHolder的参数中

getItemCount() 用于告诉RecyclerView有多少子项,返回数据源的长度
  1. 在活动中创建一个LinearLayoutManager对象,用于指定RecyclerView的布局方式,然后让RecyclerView调用setLayoutManager方法传入LinearLayoutManager参数即可。

(2)实现横向滚动
如果要实现横向滚动,子项的布局应该设为垂直排列。在活动中调用LinearLayoutManager对象的setOrientation()方法来设置布局的排列方向,默认为纵向,传入参数LinearLayoutManager.HORIZONTAL更改为横行排列。
除了LinearLayoutManager布局排列之外,RecyclerView还提供了GirdLayoutManager(网格布局)和StaggeredGirdLayoutManager(瀑布布局)两种内置布局排列方式。

(3)RecyclerView的点击事件
RecyclerView在onCreateViewHolder()方法中实现点击事件即可。RecyclerView可以实现子项中的任意控件或布局的点击事件。

猜你喜欢

转载自blog.csdn.net/YCF8746/article/details/115380984