Android 学习那些事

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中的观察者模式是对象间的一种一对多的依赖关系,当一个对象发生改变时,所有依赖于它的对象都会得到通知并且做出相应的更新


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值