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类似。

(8)ProgressBar
进度条控件,有以下参数:
android:max 进度条的最大值
android:progress 进度条已完成进度值
android:indeterminate 如果设置成true。则进度条不精确显示进度
style=”?android:attr/progressBarStyleHorizontal” 显示风格,此为水平进度条
当任务加载时,调用
progressBar.setVisibility(View.VISIBLE);
当任务结束时,调用
progressBar.setVisibility(View.GONE);

(9)Toolbar
使用androidx中的Toolbar,替换原有的actionBar,便于添加和修改功能,有以下属性:
adnroid:layout_width=“match_parent” 宽度一般铺满
adnroid:layout_height="?attr/actionBarSize" 长度和actionBar等长
adnroid:background="#ffff00" 设置背景颜色
app:navigationIcon="@drawable/ic_launcher_background" 设置导航图标,一般是返回键
app:title=“标题” 设置标题
app:titleTextColor="#ff0000" 设置标题颜色
app:titleMarginStart=“90dp” 设置标题离左边一定间距
app:subtitle=“子标题” 设置子标题
app:subtitleTextColor="@color/black" 设置子标题颜色
app:logo="@mipmap/ic_launcher" 设置logo,位置在导航图标右侧,标题左侧
通过调用toolbar.setNavigationOnClickListener方法设置导航图标的点击事件

(10)PopupWindow
弹窗,有以下方法进行操作:
setContentView(View contentView);
showAsDropDown(View anchor);
showAsDropDown(View anchor,int xoff,int yoff);
setFocusable(boolean focusable);
setBackgroundDrawable(Drawable background);
dismiss();
setAnimationStyle(int style);
setTouchable(boolean touchable);
setOutsideTouchable(boolean touchable);

三、基本布局

布局可以使界面内的多个控件美观的排布到布局上,并且通过多层布局的嵌套可以实现复杂的界面。
(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
所有控件都默认设置在布局的左上角,按照先后顺序覆盖。可以通过

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 把所有控件拖放好后,一键添加他们之间的约束关系

(6)表格布局TableLayout
将添加的控件以表格的形式一一排列,直接添加的控件将占据整行屏幕空间,使用TableRow标签,将多个控件放在一行中。
布局属性:
android:collapseColums=“1,2” 设置需要隐藏的列序号,从0开始
android:stretchColums=“3” (在隐藏基础上)设置需要拉伸的列序号,从0开始;只有控件所在行有剩余控件时才可拉伸
android:shrinkColums=”1” (在隐藏基础上)设置需要收缩的列序号,从0开始;只有控件所在行超出屏幕控件时才可收缩
子控件属性:
android:layout_column=”1” 设置控件在第几行显示,会带动其他控件移动
android:layout_span+”” 设置控件占用几列显示

(7)网格布局GridLayout
GridLayout类似TableLayout,但是使用更为灵活,既可以合并行,也可以合并列。
布局属性:
android:orientation 设置水平还是垂直显示,默认水平
android:columnCount 设置每行显示的最大个数,超出的自动换行
android:rowCount 设置一列最多显示的最大行数,超出自动换列
子控件属性:
android:layout_column 显示在第几行
android:layout_columnSpan 设置控件大小横跨几行
android:layout_columnWeight 设置控件对剩余横向空间的占比
android:layout_gravity
android:layout_row 显示在第几列
android:layout_rowSpan 设置控件大小横跨几列
android:layout_rowWeight 设置控件对剩余横向空间的占比

四、创建自定义控件

所有的空间都是直接或间接的继承自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. 在活动的onCreate方法中绑定声明的RecyclerView控件。
  3. 准备一个布局和封装它的类。
  4. 为RecyclerView准备一个适配器,新建一个类继承RecyclerView.Adapter,并将泛型指定为新建类名.ViewHolder。ViewHolder是在该类中定义的内部类。然后向其构造函数传递一个View参数,这个参数通常就是RecyclerView子项的最外层布局,这样就可以通过findViewById()方法获取布局中控件的实例。
public ViewHolder(View view){
super(view);
//获取封装的自定义控件中的子控件
}
  1. 继承RecyclerView.Adapter的类,必须重写三个方法:
onCreateViewHolder() 用于创建ViewHolder实例,在这个方法中加载RecyclerView的子布局,返回加载了布局的ViewHolder

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

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

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

(3)RecyclerView的点击事件
RecyclerView摒弃了子项点击事件的监听器,所有的事件都由具体的View去注册。于是RecyclerView可以实现子项中的任意控件或布局的点击事件。点击事件实现方式如下:

  1. 修改ViewHolder,在其中添加一个View类型变量保存子项最外层实例
  2. 在onCreateViewHolder()方法中创建一个ViewHolder变量,构造方法中传入保存的子项最外层实例。
  3. 使用ViewHolder变量调用setOnClickListener方法注册点击事件即可。

七、ViewPager控件

得到滑动变化页面的效果,使用方法如下:

  1. 在活动布局中添加ViewPager控件,新建若干ViewPager需要使用到的切换的布局文件
  2. 创建ViewPager的适配器,实现以下方法
    a) getCount() 获得ViewPager中有多少个View
    b) instantiateItem() 将给定位置的View添加到ViewGroup中创建并显示出来;返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了。
    c) isViewFromObject() 判断instantiateItem()返回的key与一个页面视图是否对应,一般写为return view==object
    d) destoryItem() 移除一个给定位置的页面。
  3. 在活动中获得ViewPager的实例,获取并添加需要使用切换的View到适配器,然后位ViewPager实例设置适配器
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值