1WebView
1.1webview简介
webview是作为承载网页的载体控件,提供两个事件回调类:WebViewClient和WebChromeClient
1.2利用webview为网站创建App
1.2.1下载Android Studio并创建一个项目
1.2.2按提示安装依赖并配置
拖拽
why android studio show error of “Missing constraints in constraintlayout”?
1)click on the "Infer constraints" Button
2)添加Base
编码
Android配置文件
访问的url必须是https协议,Android instant apps do not support http websites.
Instant apps就是常说的谷歌小程序。
你关掉网络,打开相应的app,如果显示URL不能打开,则是Hybrid或Web App,否则是Native APP
2ImageView
2.1ImageView
ImageView的src会自动抓取不同分辨率的img1
<LinearLayout>
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img1"
/>
</LinearLayout>
3Button和ImageButton
3.1另外两个不同的控件
3.2对button的监听方法
1)匿名内部内;
2)外部类;
3)实现接口的方式;
4跑马灯
4.1方法一
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
4.2px和dp的区别
由此可以看出使用px作为单位的,在不同的设备中会显示不同的效果。使用dp作为单位的,会根据不同的设备进行转化,适配不同机型。所以建议在长度宽度的数值使用dp作为单位;
由此可以看出使用sp作为字体大小单位,会随着系统的字体大小改变,而dp作为单位则不会。所以建议在字体大小的数值要使用sp作为单位;
4.3MarqueeTextView控件的几个文件的使用
strings.xml - text
activity_main.xml - relative layout, 布局
MainActivity.java - 主要的交互,操作内容
MarqueeText.jave - 控件本身的java文件
4.4AutoCompleteTextView控件
findViewById
android:completionThreshold="3" //在第3个字符开始匹配
4.5ToggleButton
isChecked()
setOnCheckedChangeListener()
5DropDownMenu
5.1出过的错
5.1.1Emulator: glTexImage2D: got err pre :( 0x502 internal 0x1908 format 0x1908 type 0x1401
Go to Tools > AVD Manager > Virtual device configuration > Show advanced settings > Boot option > Cool boot
Then run again your project with that AVD. Close the session and set again Quick boot in Boot option.
https://stackoverflow.com/questions/50595704/glteximage2d-got-err-pre-0x506-internal-0x1908-format-0x1908-type-0x1401
5.1.2java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
5.2其它下拉菜单的解决方案
5.2.1Spinner实现下拉列表
5.2.2PopupWindow
5.3最后的展示
5.4开发步骤
5.4.1基本概念
1) 什么是APP原生开发
APP原生开发就是:html+js,只是这里的html和js都是用java语言写的
什么是context?
Android程序员把“场景”抽象为Context类;
一个应用程序可以认为是一个工作环境,用户在这个环境中会切换到不同的场景;
一个前台秘书,她可能需要接待客人,可能要打印文件,还可能要接听客户电话,而这些就称之为不同的场景(Context),前台秘书可以称之为一个应用程序;
Activity,Service,Broadcast Receiver,Content Provider四大组件;
一句话总结:Context的两个子类分工明确,其中ContextImpl是Context的具体实现类,ContextWrapper是Context的包装类。Activity,Application,Service虽都继承自ContextWrapper(Activity继承自ContextWrapper的子类ContextThemeWrapper),但它们初始化的过程中都会创建ContextImpl对象,由ContextImpl实现Context中的方法。
在应用程序中Context的具体实现子类就是:Activity,Service,Application。那么Context数量=Activity数量+Service数量+1。当然如果你足够细心,可能会有疑问:我们常说四大组件,这里怎么只有Activity,Service持有Context,那Broadcast Receiver,Content Provider呢?Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context都是其他地方传过去的,所以并不计入Context总数。上面的关系图也从另外一个侧面告诉我们Context类在整个Android系统中的地位是多么的崇高,因为很显然Activity,Service,Application都是其子类,其地位和作用不言而喻。
作者:尹star 链接:https://www.jianshu.com/p/94e0f9ab3f1d
2)这里R是什么呢?
Android实际上会把res目录下的所有文件都赋予一个整型索引,统一放到R.java文件中。需要引用资源文件时,调用R...就可以引用到这个资源的索引了。
3)AndroidManifest.xml文件是什么?
这里记录了你的app的注册信息和配置信息,包括app所用到的权限,组件(譬如Activity就是Android的四大组件之一)等等都需要在这个文件中一一描述,否则你的app可能会出现无法运行的情况;
4)setContentView(R.layout.activity_main)是干什么的?
是为了把activity_main就和MainActivity关联起来。
5) 开发的思路
首先,定义了2个layout, 它们之间是下划线;
其次,目录的4个文本需要传递,其次4个弹出框也需要传递,最后就是内容区域;从哪里传过来,那就是activity,DropDownMenu.java接收到后再绘制上去;
5.4.2项目架构
所谓MainActivity对应的就是我们app上的一个个可以跳转的页面,而跟activity_main则是与MainActivity关联的布局文件;
5.4.3布局
首先顶部选择的是线性布局LinearLayout,底部选择的是容器布局FrameLayout,遮盖是View控件,而且在内容的view之上,菜单view在最上层(这个菜单view采用下拉菜单容器布局popupMenuViews),所以必须采用FrameLayout布局:
顶层是下拉菜单容器布局popupMenuViews
中间是遮盖层maskView
最底层是contentView
我们知道,应用一般分为两类:1是Web Applications,2是Mobile;
5.4.4绑定事件
就像在WebApp里写一些事件是一样的;
6Android - QQ登录
6.1流程
https://www.imooc.com/video/11787
7RecyclerView
7.1RecyclerView的应用场景:
1)多种样式的列表,RV还都是由列表组成,只是由不同样式的列表组成
2)宫格(网格Grid)和列表(List)同时存在,宫格是一行有几个item(以下例子中间还有一个section),而list的一行只有一个item
3) 分类列表,就是每个分类之间有section(通过ItemDecoration实现)
7.2需要的基础
1) 掌握RecyclerView的基本用法
可以重复利用的View
2) RecyclerView.Adapter的作用:跟ListView.Adapter的作用不同
复写getItemViewType(int position),得到不同位置itemView的type
ItemType保存在Holder中,Holder根据position被缓存在cache中,系统会在cache中拿holder,这样更流畅
需要处理getItemCount(),添加section后,数量的统计肯定是会变的
需要处理onCreateViewHolder和onBindViewHolder (就如同getView()一样是核心中的核心)
实际是根据不同类别得到不同的View,就如ListView中的getView()方法,这里拆成2个来做
3) 怎么拿到RecyclerView的数据
把数据包装进一个Object,然后根据Type去ListObject里取字段,展现不同item
封装RecyclerView.Adapter,把一些不同的item当作header,比如把一堆列表数据上的轮播图当作header
4) RecyclerView.Holder
包装了一个view, ListView保存的是View,而RecyclerView保存的是Holder...Holder保存了Type, position的值
RecyclerView自带Holder,hold一些view的元素;而ListView没有Holder
5) RecyclerView.Recycler
保存了缓存的机制,类比convertView
上述的holder保存在Recycler的map,从而实现对type, position的缓存
多个RecyclerView公用一个RecycleredPool
6) 和ListView的区别
ListView的type保存在ListView中(以数组的形式保存),而RV的type保存在holder中, RV的缓存单位是Holder而不再是View,缓存的key是Type
7) 总结
看来type很重要,既要根据type缓存getView,又要根据type拿数据adapter
7.3实战
7.3.1添加依赖:implementation'com.android.support:recyclerview-v7:28.0.0'
7.3.2创建ViewHolder
ViewHolder用来保存视图
7.3.3创建多种样式的列表
7.3.4创建网格和列表混排的RV
7.3.5处理各个列表返回不同的字段
比如:列表list1, list2, list3要求返回的数据字段;