1、BaseAdapter详解
BaseAdapter的四个基础方法
- getCount : 要绑定的条目的数目,比如格子的数量
- getItem : 根据一个索引(位置)获得该位置的对象
- getItemId : 获取条目的id
- getView : 获取该条目要显示的界面
2、 ViewHolder详解
使用listView的时候,通过ViewHolder进行缓存可以提升性能
viewholder的作用是因为Android有个recycler的反复循环器,viewholder就是借助他来做到循环利用itemview。
例如:
默认加载10个itemview,初始化的时候创建一个viewholder,并把10个itemview加载到内存里面。
接着下滑,加载5-15的item,这个时候,显示的还是只有10个view。
我们只是需要重新填充view的数据,而不需要再次创建view并加载到内存里面,这样就可以复用itemview而避免频繁创建view导致的内存消耗了。
结论:相当于只创建了一次view,其他时候都在复用view,只是更改了数据而已
3、gravity详解
gravity组件是组件对自身内容的限定
4、Drawable详解
Drawable是被画的东西的通用抽象类,多数情况下,drawable一般用作画在 屏幕上的资源;
Drawable类提供了一个通用的API去处理优先的各种类型的可视化资源。与View不同,Drawble 没有接收事件和用户交互的能力。
5、@Nullable 注解详解
@Nullable 注解可以使用在方法、属性、参数上,分别表示方法返回可以为空、属性值可以为空、参数值可以为空
2、用在方法上
方法的返回值可以为空。
3、用在参数上
参数值可以为空
4、用在属性上
属性值可以为空
5、FragmentTransaction详解
在Android中,对Fragment的操作都是通过FragmentTransaction来执行。而从Fragment的结果来看,FragmentTransaction中对Fragment的操作大致可以分为两类:
显示:add(),replace(), show() , attach()
隐藏:remove(), hide() ,detach()
对于每一组方法,虽然最后产生的效果类似,但方法背后带来的副作用以及对Fragment的生命周期的影响都不尽相同。
add() vs. replace()
只有在Fragment数量大于等于2的时候,调用add()还是replace()的区别才能体现出来。当通过add()连续两次添加Fragment的时候,每个Fragment生命周期中的onAttach()-onResume()都会被各调用一次,而且两个Fragment的View会被同时attach到containerView。
同样,退出Activty时,每个Fragment生命周期中的onPause()-onDetach()也会被各调用一次。
但当使用replace()来添加Fragment的时候,第二次添加会导致第一个Fragment被销毁,即执行第二个Fragment的onAttach()方法之前会先执行第一个Fragment的onPause()-onDetach()方法,同时containerView会detach第一个Fragment的View。
show() & hide() vs. attach() & detach()
调用show() & hide()方法时,Fragment的生命周期方法并不会被执行,仅仅是Fragment的View被显示或者隐藏。而且,尽管Fragment的View被隐藏,但它在父布局中并未被detach,仍然是作为containerView的childView存在着。相比较下,attach() & detach()做的就更彻底一些。一旦一个Fragment被detach(),它的onPause()-onDestroyView()周期都会被执行。
remove()
其实看完上面的分析,remove()方法基本也就明白了。相对应add()方法执行onAttach()-onResume()的生命周期,remove()就是完成剩下的onPause()-onDetach()周期。
5.1 在Activity中添加Fragment,一般有两种方法:一种是直接在布局文件中添加,将Fragment作为Activity的整体布局的一部分;另一种是在Activit运行时,将Fragment放入Activity布局中;
例如:(1)在<fragment></fragment>标记中,android:name属性用于指定要添加的Fragment
(2)如果要在Activity运行时添加一个名称为DetailFragment的Fragment,代码如下:
DetailFragment detail=new DetailFragment();//实例化DetailFragment的对象
FragmentTransaction ft=getFragmentManager().beginTransaction();//获得一个FragmentTransaction的实例
ft.add(android.r.id.content,details);//添加一个显示详细内容的Fragment
ft.commit();//提交事务
6、getInstance详解
总的来说:这是单例模式,一般用于比较大,复杂的对象,只初始化一次,应该还有一个private的构造函数,使得不能用new来实例化对象,只能调用getInstance方法来得到对象,而getInstance保证了每次调用都返回相同的对象。
详细解释一下:对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等。
*直接使用new就不能实现好的,这时候需要使用间接使用new,即getInstance方法。这是一个设计方式的代表,而不仅仅指代一个方法名。
1. new的使用:
如Object _object = new Object(),这时候,就必须要知道有第二个Object的存在,而第二个Object也常常是在当前的应用程序域中的,
可以被直接调用的
2. GetInstance的使用:
* 在主开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,即内存中有一块区域专门用来存放静态方法和变量,
* 可以直接使用,调用多次返回同一个对象。
3.两者区别对照:
* 大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new,new就是通过生产一个新的实例对象,或者在栈上声明一个对象 ,每部分的调用
* 用的都是一个新的对象。
* getInstance是少部分类才有的一个方法,各自的实现也不同。
* getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的访问点)的类中常见,用来生成唯一的实例,getInstance往往是static的。
*
* (1) 对象使用之前通过getInstance得到而不需要自己定义,用完之后不需要delete;
* (2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new;
* (3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()通常是创建static静态实例方法的。
*
* 总结:
* getInstance这个方法在单例模式用的甚多,为了避免对内存造成浪费,直到需要实例化该类的时候才将其实例化,所以用getInstance来获取该对象,
* 至于其他时候,也就是为了简便而已,为了不让程序在实例化对象的时候,不用每次都用new,索性提供一个instance方法,不必一执行这个类就
* 初始化,这样做到不浪费系统资源!单例模式 可以防止 数据的冲突,节省内存空间
7、toast弹窗安卓
(1)普通toast弹窗
Toast.makeText()是一个有参函数,参数值有三个。
第一个参数是当前的上下文控件,getApplicationContext()获取上下文对象或this获取当前对象。
第二个参数是你自己要显示的文字。
第三个参数是显示的时间长短。有两种形态的值,一个是ms为单位。一个是长的3.5s和短的值2s。但是这种toast普通弹窗不能点按钮取消,只能等待时间过去。自行消失。是典型的提醒框。
(2)设置toast弹窗的位置
Toast.setGravity()是一个有参函数,参数值也是三个。
第一个参数设置toast弹窗在屏幕中显示的位置Gravity.top置顶,Gravity.center居中,Gravity.bottom底部。
第二个参数是设置x轴的值,正数为右,负数为左。
第三个参数是设置y轴的值,正数为上,负数为下。
(3)toast弹窗中有图片
在弹窗中添加图片,其实本质是给弹窗视图添加一个图片视图,弹窗视图中有布局对象,在布局对象中添加图片视图。 toastView.addview
ImageView img= new ImageView(this);
//创建图片视图对象 ,this获取当前文件
img.setImageResource();
//设置图片
LinearLayout toastView = (LinearLayout) toast.getView();
//获得toast线性布局
toastView.setOrientation(LinearLayout.HORIZONTAL);
//设置线性布局为横向
toastView.addView(img, 0);
//将Img在加入到此布局中的第一个位置
(4)自定义toast弹窗
大概的原理是这样的new 一个toast类对象。然后你可以在类里写东西。也可以实例化一个弹窗对象,然后赋给新的对象样式
LayoutInflater inflater=LayoutInflater.from(this);//创建一个layoutInFlater类对象,获取的控件变成视图
View root=inflater.inflate(R.layout.toast, null);//将布局文件/res/layout/toast.xml实例化为root对象,从当前对象中提取视图。
Toast toast=new Toast(MainActivity.this);//完全自定的toast要用构造函数来生成对象
toast.setView(root);//设置自定义toast样式
toast.setDuration(Toast.LENGTH_LONG);//设置toast的显示时间
toast.show();
8、Intent相关
Android中组件之间的通信是通过Intent协助完成的,Android根据Intent的描述,负责找到相应的组件,将Intent传递给调用的组件,并完成组件的调用。一个Intent对象实质上是一组被捆绑的信息,也可以是Android系统感兴趣的信息。
Intent可以分为显示Intent和隐式Intent两种;显示:指定确切的接收者;隐式:使用隐式Intent启动Activity时,需要为Intent对象定义Action、Category和Data属性,然后在调用startActivity方法来启动匹配的Activity.
Intent过滤器:隐式Intent启动Activity时,并没有在Intent中指明Activity所在的类,所以Intent过滤器是一种根据Intent中的Action、Data和Category等属性对适合接受该Intent的组件进行匹配和筛选的机制。
Intent协助完成Android各组件之间的通讯
Intent作用的表现形式为:
启动Activity
通过Context.startActvity() / Activity.startActivityForResult()启动一个Activity;
启动Service
通过Context.startService()启动一个服务,或者通过Context.bindService()和后台服务交互;
发送Broadcast
通过广播方法Context.sendBroadcasts() / Context.sendOrderedBroadcast() / Context.sendStickyBroadcast()发给Broadcast Receivers
9、观察者模式
Android中的观察者模式是对象间的一种一对多的依赖关系,当一个对象发生改变时,所有依赖于它的对象都会得到通知并且做出相应的更新