此文章是根据B站的视频教程整理总结的笔记,用白话说明一些Android开发的入门知识,共勉。
B站教程链接:https://www.bilibili.com/video/BV13y4y1E7pF?p=12&spm_id_from=pageDriver
视频是基于Java的,我用Kotlin写的源码链接(Topics = "android-bilibili-course"):https://github.com/Flameyjh?tab=repositories
目录
类似“记住用户名”打勾,看书到69页,这种配置信息应该保存到SP中。SQLite和ROOM都是数据库,SQLite是早期原生数据库,ROOM是后期简洁数据库,类似电话簿这种列表信息应该保存到数据库中。
控件介绍
TextView
Button
EditText
输入框里面的内容。继承自TextView,可以设置图片drawable、默认输入提示hint等。
ImageView
图片。
ProgressBar
进度条。
Notification
通知。
ToolBar
页面上方导航栏。可以设置背景、标题、图标等。可以在内部添加TextView使文字居中。
AlertDialog
弹出来的对话框。需要new一个构建器AlertDialog.Builder去设置对话框的内容。可以添加“确认”、“取消”、“中间”等不同类型的按钮。
setView(name_view) 方法可以给对话框添加View,xml布局可以变成View去使用:View view = getLayoutInflater().inflate(R.layout.name_xml, null)。
PopupWindow
弹出来的对话框。直接new一个PopupWindow即可。可以设置点击空白处取消或者点击按钮取消。
布局
LinearLayout
线性布局。oritation设置水平、垂直。gravity在父容器中设置,设置子元素整体居中、水平方向居中、垂直方向居中。layout_gravity在子元素中设置,设置它在父容器中的对齐方式。layout_weight设置剩余空间根据权重分配。
RelativeLayout
相对布局。默认放在父容器左上角。根据父容器定位layout_alignParentLeft。根据兄弟组件定位layout_toLeftOf。设置组件与父容器的间距margin。设置组件内部元素的间距padding。
FrameLayout
帧布局。设置前景,设置前景位置。
TableLayout
表格布局。和TableRow结合使用,可以一行一行的显示。设置需要被隐藏的列。设置允许被拉伸、收缩的列。子控件显示在第几列、横向跨几列。
GridLayout
TableLayout不能把两行合并,只能把两列合并。GridLayout既能行合并,也能列合并。
ConstraintLayout
约束布局。约束上下左右。可以通过design界面的拖拽实现约束。可以添加指导线进行更方便的设置。可以直接推导约束。
ListView
- 创建一个ListView的布局,创建一个item的布局;
- 创建一个List类型的数据,表示每个item的文本内容;
- 创建一个继承自BaseAdapter的Adapter,重写getView方法,拿到item布局渲染的convertView,把数据绑定到每一个convertView。
- 可以用ViewHolder优化,把item的view元素放到viewHolder里,通过viewHolder去设置和取用这些元素。
RecyclerView
动画
帧动画
通过多张图片替换形成动画。
- 设置animation-list类型的xml,作为其他布局的background使用;
- 通过布局.getBackground得到AnimationDrawable类型anim。然后通过anim.start()启动动画。
补间动画
通过调整透明度、旋转、缩放、平移形成动画。
- 通过加载xml动画设置文件来创建一个Animation对象。Animation animation = AnimationUtils.loadAnimation(context, R.anim.动画设置文件名);
- 普通的图片就可以通过开启animation来设置动画。imageView.startAnimation(animation)。
属性动画
ValueAnimator改变值, ObjectAnimator改变对象的属性值。
单位和尺寸
px:像素。绝对单位,默认单位。pt:绝对单位。dp:相对单位。xml中常用,不同设备不同显示效果。sp:相对单位。和dp可以转换,主要用于字体显示。
ViewPager
能够左右滑动的资源位。
- 3个子页面的xml布局文件,一个包含ViewPager的xml文件;
- 在Activity中把三个子页面的布局渲染成3个view,并添加到一个ArrayList中去,作为数据;
- 自定义一个继承自PagerAdapter的myAdapter,在里面绑定数据;
- 把viewPager的adapter设置为myAdapter。
Fragment
可以看做小型简单的activity。用于平板电脑界面动态灵活设计,一个布局适配两种设备,简单高效,易于维护。
为什么用fragment而不用两个layout达到效果?两个layout需要判断当前屏幕大小然后转换布局。
特性:具备生命周期,不能独立使用,必须委托在activity中才能运行。一个activity可以有多个fragment,一个fragment也可以在多个activity中重复使用。
使用方法:
- 创建一个fragment,就会出现一个Fragment.java和一个对应的fragment.xml;
- 在Fragment.java里,把fragment.xml渲染成view,并且给view里面的元素添加监听;
- 在其他页面的布局文件,比如main.xml 中去使用上面创建的fragment.java。
fragment动态添加和管理:
使用fragmentManager,fragmentTransaction。
Activity和Fragment通信:
- 原生方案:Bundle。fragment.setArguments(bundle)。
- 类与类通信常用方案:接口作为参数类型传值。具体操作:在F里面new一个空的接口类型的对象作为函数参数,提供一个set函数给外部;然后在B中调用A的set函数,new一个有内容的接口对象赋值给A中空的接口对象(这一步其实就是对接口里面函数的具体实现)。
- 上面两种方案需要信息已经提前准备好,但是我们还需要能够即时的通信。其他封装好的方案:eventBus、liveData。这些都是观察者模式。
Fragment生命周期: