Xml布局常见问题总结

来源:互联网 发布:申请加入淘宝商城 编辑:程序博客网 时间:2024/05/19 23:03

又到周末,转悠了一天总算安静下来;继续开始总结项目中出现一些问题。吐槽一下,听一块骑行的小伙伴常说只要进入了骑行的队伍,那么就算是入了坑了:备胎,打气筒,轮组的升级等等吧,总有一些关于自行车的东东支出一些很大的开销,就我那个远在上海的破山地(现在在北京出差)为了折腾它前前后后也投入了不少的大洋。其实这根计算机比起来根本不算是坑,特么的计算机才是最大的坑,各种技术虽然说不必要都会,都精通,但好歹也得听说过不是,神马RxJava,RxAndroid,FlatBuffers,OkHttp,KotLin….不胜枚举,总之有时候会有一种无力感,也有一种想一口吃个胖子的感觉,但是这是不可能的和不现实的,也会把自己弄的心力憔悴,还是一步步来吧,现在开始继续罗列在开发中小伙伴出现的一点问题,一天进步一点点,就算进步不了也就当“好记性不如个烂笔头”吧,方便以后的查阅。

1)被误用的ViewGroup

什么是ViewGroup?这TMD神马问题,是个android Monkey都知道啊!是的ViewGroup就是用来Group View的,用来布局“若干”个View。但是在小伙伴的xml布局文件里(包括本人在14年初学android的时候也犯过这个问题)总会有类似如下的代码:

<RelativeLayout         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="xxx"        android:layout_marginRight="yyy"        android:layout_marginTop="zzzzz"            >          <ImageView            ...             />        </RelativeLayout>

上面的布局很简单,就是一个RelativeLayout布局包裹了一个ImageView,且就只有这个一个ImageView这个childView!但是使用这个RelativeLayout这个ViewGroup的原因仅仅是用它的marginLeft,marginRight等属性来控制里面仅有的一个ImageView显示的的位置!!!这无疑是很low的一种布局方案,因为RelativeLayout根本没有发挥出它应用的责任(之一):Group View!而且xml在解析的时候因为这个不必要的嵌套影响了一部分性能和开销。多此一举,性能优化就在点滴之间,所以code review的结果当然就是直接把RelativeLayout砍掉!

2)被遗忘的ImageView的background属性

这个问题的布局有点类似于第一点被误用的ViewGroup,不过这个被误用的倒不是ViewGroup,而是ImageView.布局代码如下:

<RelativeLayout         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="your drawable"          >          <ImageView            android:src="you image"             />        </RelativeLayout>

这个布局的意图是:为ImageView设置一个背景图片,所以就在ImageView外面套上一个ViewGroup!其实完全没必要嘛,android中View设个类中本来就提供了background的属性,何况ImageView这个View的子类么,所以直接在code review的时候直接把这个代码优化之:

<ImageView            android:src="you image"             android:background="your background drawable"             />    

其实说到这个background属性,在TV端应用的时候也有一个很大的误用的地方,也会造成不必要的ViewGroup应用的情况。
应用场景:
TV端的android应用由于是有遥控器来控制的,所以凡是focusable=true的View在UI设计的时候都会有设计一个选中的焦点框,表明选中的View可以执行onClick操作,在此以Button为例子,所以在code review的时候发现了如下问题布局:

<!--your_selector :改名字是博主随便起的--> <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="@drawable/your_selector" >        <Button        ....        /></LinearLayout>

看看Button外面又包裹了一个LinearLayout这个ViewGroup设置其backround属性来为Button的选中效果添加选中框。这明明就可以把这个background设置在Button这个控件上面,优化后的布局代码就不用帖了!

3)被遗忘的android:drawableLeft等属性

在UI设计的时候往往在一个文字的左边或者右边有一个小小的图标来展示,这样的UI完全可以用TextView的android:drawableLeft、android:drawableRight等来搞定;但往往有时候会忽略或者遗忘这个属性而写出如下xml的布局:

 <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <ImageView          android:src="image"        />          <TextView        ....        /></LinearLayout>

而上面的布局用了android:drawableLeft属性,xml布局完全可以简化成如下的代码:

<TextView   android:drawableLeft="image"   android:text="some text" />

目前发现的问题就这么多,总的来说上面的一些问题都可以归结为一类:就是对于view的一些属性不熟或者不小心遗忘而造成了xml布局文件增加了不必要的ViewGroup布局。这些在xml布局中都是可以优化的地方,在此开篇博客专门记录下来,也算是以后警醒自己吧,在开发的时候要注意:xml布局少一些不必要的嵌套。本篇博客会持续更新,算是处于未完待续状态吧,毕竟我想以后还会发现一些其他关于布局上的问题。欢迎批评指正,共同学习和提高。

0 0
原创粉丝点击