项目中的小问题

正在做一只图片相关的产品。

关于UI

1. 问题:自己写测量view大小的时候,返回的结果总是错的。

原因:在layout_height中使用wrap_content,这样就需要多次测量。一次测量的结果就是错的。

解决方法:在设置大小的时候尽量使用常量

遗留问题:view在测量控件大小的时候的算法是什么?需要看源代码查找吗?

评论:android中的layout_width和layout_height最好能够赋值常量。对于铺满全屏的控件设置成fill_parent没啥。对于内容大小有变的设置成wrap_content。但是最好少用wrap_content这个选项。因为在控件调用measure时会多次测量。这样一方面浪费资源;另一方面,如果自己要对控件进行测量的话,也会带来多次测量的麻烦。还有一个比较关键的地方就是在listiew一样的AdapterView中,每次加载新的条目时都要测量大小。如果不是固定大小,得测多少次呀。在滑动时也会卡的。所以在写的时候,尽量不要使用wrap_content。根据设计搞自己算出大小然后添在layout参数中。

[2012-07-26]


2. 这个是经验吧,关于用inner drawable替代layout拼凑的方式。

刚开始做的时候,遇到文字前后左右有图片的时候,会习惯用LinearLayout套图片和文字。这么做的好处是可以随便调整大小。坏处是结构比较复杂。替代方案是,设置Textiew的drawableLeft/Right/Top/Down来添加图片。

原因:view的源代码有9102行,ViewGroup有3202行。所以用LinearLayout,就要至少9102*3+3202行代码对象的创建。同时还包括GroupView中onMeasure,onLayout等等的开销。资源消耗是几倍的TextView吧。TextView中drawable无法设置大小的确是个问题。在代码中设置drawable的大小,然后传给TextView是一个解决方法。

评论:能尽量少用layout就尽量少用。多了解widget的用法,减少创建view的消耗。在刚开始学一个东西的时候,总是在找万能工具,比如用layout构建所有的布局。深入之后,会发现专用工具更好用。这个过程总是从完成功能向着优化方向发展,不过自己得去寻找去思考。

[2012-07-26]

3. style的使用。

这个项目之前不会用style,也不知到那是什么。style是android中用于统一配置xml参数的工具。想吧,你有3个工具栏,拥有相同的确认按钮和取消按钮,以及背景图片和padding等。只是内部布局不太一样。相同的参数是不是要在各个控件中都写一边?用style就可以解决这个问题

下面是一个ImageButton的style,写在res/values/styles.xml中

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="topbar_btn" parent="@android:style/Widget.ImageButton">
        <item name="android:layout_width">48dp</item>
        <item name="android:layout_height">31dp</item>
        <item name="android:background">@drawable/bg_btn_title</item>
        <item name="android:paddingBottom">8dp</item>
        <item name="android:paddingTop">8dp</item>
        <item name="android:scaleType">centerInside</item>
    </style>
</resources>

然后配置按钮:

    <ImageButton
        android:id="@+id/btnRight"
        style="@style/topbar_btn"
        android:layout_alignParentRight="true"
        android:src="@drawable/ico_refresh" />
在按钮中添加一个style="@style/topbar_btn"就可以将上面设置的参数放到按钮中了。在修改的时候也不用一个一个xml找了。

[2012-07-26]


关于算法:

1. list中的删除操作

过程是这样的:通过index从list中取出一条数据,访问网络先删除网络数据,删除成功之后再删除本地数据。问题是,这个操作是否支持并发?如果支持并发的话,index取出的数据在去删除的时候,如果别的数据在这条数据删除之前被删除,这个index可能就改变了,会删除错误的数据。所以,需要用取出的数据回list中重新定位,然后删除,便可支持并发。

Object o2Del = list.get(index);
networkDelete(o2Del);
int pos = list.indexOf(o2Del);
if(pos != -1){
    list.remove(pos);
}
[2012-08-02]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值