項目中的小問題

正在做一隻圖片相關的產品。

關於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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章