关于Custom View初步研究

来源:互联网 发布:php the right way 编辑:程序博客网 时间:2024/05/29 04:59

关于Custom View初步研究

今日做了一个配置切换器,直接写在Activity上面,给我的感觉就像C语言直接main函数里面一样,决定把它拖出来,做成一个部件。

写了一个layout.xml 继承了LinearLayout。然后一直在纠结怎么把xml inflate到自己的ViewGroup类里面。由于在家里,没有参考代码。只能自己拍脑袋空想。于是想出来第一个办法:

在构造函数里面加AddView。东西出来功能正常了,但是本应该与屏幕同宽的,发现没有这样,以为xml没写match_parent,但是真的写,然后乱改xml,效果还是一样。于是继续拍脑袋空想。。终于悟道了一些东西。


上图是HierarchyViewer(以下简称Viewer)显示出来的ViewTree。下面一棵树为我自己的Activity。从FrameLayout开始是走自己xml。

层次关系为:

LinearLayout

----ToggleBarView

    ----LinearLayout

         ----ToggleButton

         ----ToggleButton

         ----ToggleButton

         ----ToggleButton

         ----ToggleButton

 

ToggleBarView为自定义的ViewGroup。里面包含一个LinearLayout,从Viewer显示出来,LinearLayout里面的Layout是正常的,错就在ToggleBarView后面多出了一块空白区域,所以,错误肯定不在LinearLayout以下的层次里,必定在ToggleBarView这一层。如果是xml错了,要改也是改与ToggleBarView下面的一个节点(直接子节点)(如果改ToggleBarView自己,也就是在main xml里面ToggleBarView只是改变ToggleBarView的性状,比如让她在整个屏幕左边,右边,扁,长条等等),也就是xml文件的根节点。。但是这个根节点怎么改也不会好

后面看了看这个LinearLayout的LayoutParams,发现width与height都是WRAP_CONTENT与xml里面的match_parent不一样,于是查代码,AddView(View v)他说如果v没有LayoutParams,那么将使用默认的LayoutParams。单步调式了下Inflate LinearL的过程。发现返回的LinearLayout果然是没有LayoutParams的,于是问题就是为什么没有生成LayoutParams,原因貌似是没有Parent,那么又为什么会没有Parent的呢,这个目前不知道,没有framework的代码。可能要研究下整个Inflate的过程才能知道。目前先不研究。既然知道没有LayoutParams那么就手动配一下LayoutParams。使用addView(View v LayoutParams lp)来添加View。调式一下,恩,OK

 

其实还有一种方法。因为ToggleBarView继承LinearLayout。可以直接在main xml 里面的ToggleBarView标签下面添加child。就和使用LinearLayout一样。这样也不用自己去管LayoutParams的事情,一切都会很正常。但是会有一些问题。

因为这个部件功能单一,就5个按钮,多一个、少一个,id不对都不行,这些东西不应该让用户去配。用户也不一定知道怎么配。这也是实现封装的一种体现吧。所以不应该把它写在ToggleBarView里面,虽然可以这么写。不符合封装性的思想。

 

根本的解决方法应该是研究为什么根节点的属性会没有生成。。