activity布局文件的一些事儿

            头一次写有关技术类的东西,写在这里主要目的不是为了教给任何人知识点,而是为了提醒自己,作为菜鸟,我今天学习了,有点收获。废话不说了,开始正文了。

 

          Activity的布局文件经常写,每次写完呢,通过setContentView()方法就完了,就能显示自己写的UI。但是也从没问过为啥,也不清楚原理。最近在写PopMenu和PopWindow时 ,就想了解下这2者的区别,没成想饶了一圈回到了布局文件。

          今天的收获:

            

  1 Activity中有一个成员是Window,而Window本身是个抽象类,是用来绘制窗口的,提供了一组API。

  2 PhoneWindow是Window的具体实现类,而且还包含一个DecorView对象(这个对象是所有应用窗口的根View,例如Activity界面的)         

 3  DectorView是PhoneWindow的内部类,是对FrameLayout进行功能修饰的。

 形象的讲这些成员的关系就是:

  window是一块电子屏,phoneWindow是一块手机电子屏,DectorView就是电子屏要显示的内容,而Activity就是手机电子屏安装的位置。说白了,我们熟悉的activity就是个载体显示DectorView,显示我们自己定义的布局文件。

  

 4  LayoutInflater相关的
   

        我们先看一下源码中LayoutInflater实例化获取的方法:


 
 
public static LayoutInflater from (Context context) {
LayoutInflater LayoutInflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null ) {
throw new AssertionError( "LayoutInflater not found." );
}
return LayoutInflater;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

看见没有?是否很熟悉?我们平时写应用获取LayoutInflater实例时不也就两种写法吗,如下:


 
 
LayoutInflater lif = LayoutInflater.from(Context context);
LayoutInflater lif = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

 所以我们常常调用的form方法也就是对第二种方法的一种封装。

5 优化布局文件的一些方法

  

    xml文件解析实质是递归控件,解析属性的过程。所以说嵌套过深不仅效率低下还可能引起调运栈溢出。同时在解析那些tag时也有一些特殊处理,从源码看编写xml还是有很多要注意的地方的。所以说对于Android的xml来说是有一些优化技巧的(PS:布局优化可以通过hierarchyviewer来查看,通过lint也可以自动检查出来一些),如下:

尽量使用相对布局,减少不必要层级结构。不用解释吧?递归解析的原因。

使用merge属性。使用它可以有效的将某些符合条件的多余的层级优化掉。使用merge的场合主要有两处:自定义View中使用,父元素尽量是FrameLayout,当然如果父元素是其他布局,而且不是太复杂的情况下也是可以使用的;Activity中的整体布局,根元素需要是FrameLayout。但是使用merge标签还是有一些限制的,具体是:merge只能用在布局XML文件的根元素;使用merge来inflate一个布局时,必须指定一个ViewGroup作为其父元素,并且要设置inflate的attachToRoot参数为true。(参照inflate(int, ViewGroup, boolean)方法);不能在ViewStub中使用merge标签;最直观的一个原因就是ViewStub的inflate方法中根本没有attachToRoot的设置。

使用ViewStub。一个轻量级的页面,我们通常使用它来做预加载处理,来改善页面加载速度和提高流畅性,ViewStub本身不会占用层级,它最终会被它指定的层级取代。ViewStub也是有一些缺点,譬如:ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不能够再通过ViewStub来控制它了。所以它不适用 于需要按需显示隐藏的情况;ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。如果想操作一个具体的view,还是使用visibility属性吧;VIewStub中不能嵌套merge标签。

使用include。这个标签是为了布局重用。

控件设置widget以后对于layout_hORw-xxx设置0dp。减少系统运算次数。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值