記Android xml上一個兼容問題.

dim.red

布局.png

開始

在開發(fā)中有兩種是我們比較常做的是適配和兼容.
適配一般是解決分辨率的問題,多發(fā)生在 xml 文件中.
兼容是指解決的是系統(tǒng)版本不同導致的結果不一致或者不工作的問題.
今天講一個 xml兼容上面的問題, 我們都知道一份 xml 會在不同的分辨率下展示的樣式可能有差,但是一份 xml 會不會在相同手機不同系統(tǒng)版本展示不同呢?
我們來看一個例子.下面的截圖為一開始的布局xml.兩者使用相同的布局xml,展示卻有所不同.

4.0 上的效果

4.0 上的效果.png

5.0 上的效果

5.0 上的效果.png

View 層級邏輯

5.0 以前 靠編寫時候View 的順序. 最先寫的 View 的層級是在最下面.
5.0 以后 引入一個Z 軸的概念.Z 軸越高層級越高,相同 Z軸,再比較編寫時候的順序,而 Button 天生高個.

分析

ViewGroup 的繪制是由dispatchDraw(Canvas canvas)觸發(fā)的.

@Override
protected void dispatchDraw(Canvas canvas) {
    ...
    List = usingRenderNodeProperties
            ? null : buildOrderedChildList();
    ...  
}

dispatchDraw(Canvas canvas)中調用了buildOrderedChildList 對 childView 進行重新排序.


/**
 * Populates (and returns) mPreSortedChildren with a pre-ordered list of the View's children,
 * sorted first by Z, then by child drawing order (if applicable). This list must be cleared
 * after use to avoid leaking child Views.
 *
 * Uses a stable, insertion sort which is commonly O(n) for ViewGroups with very few elevated
 * children.
 */
ArrayList<View> buildOrderedChildList() {
    final int count = mChildrenCount;
    if (count <= 1 || !hasChildWithZ()) return null;

    if (mPreSortedChildren == null) {
        mPreSortedChildren = new ArrayList<View>(count);
    } else {
        mPreSortedChildren.ensureCapacity(count);
    }

    final boolean useCustomOrder = isChildrenDrawingOrderEnabled();
    for (int i = 0; i < mChildrenCount; i++) {
        // add next child (in child order) to end of list
        int childIndex = useCustomOrder ? getChildDrawingOrder(mChildrenCount, i) : i;
        View nextChild = mChildren[childIndex];
        float currentZ = nextChild.getZ();

        // insert ahead of any Views with greater Z
        int insertIndex = i;
        while (insertIndex > 0 && mPreSortedChildren.get(insertIndex - 1).getZ() > currentZ) {
            insertIndex--;
        }
        mPreSortedChildren.add(insertIndex, nextChild);
    }
    return mPreSortedChildren;
}

修正方法

我們可以通過修改 Button為 TextView 來保證布局在不同系統(tǒng)版本下的一致性.因為 TextView 的 Z軸跟 LinearLayout 是一樣的.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草戈,一起剝皮案震驚了整個濱河市耐朴,隨后出現(xiàn)的幾起案子驹沿,更是在濱河造成了極大的恐慌犀盟,老刑警劉巖翁都,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮罪,死亡現(xiàn)場離奇詭異姨谷,居然都是意外死亡逗宁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門梦湘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞎颗,“玉大人,你說我怎么就攤上這事捌议『甙危” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵禁灼,是天一觀的道長管挟。 經(jīng)常有香客問我,道長弄捕,這世上最難降的妖魔是什么僻孝? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮守谓,結果婚禮上穿铆,老公的妹妹穿的比我還像新娘。我一直安慰自己斋荞,他們只是感情好荞雏,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般凤优。 火紅的嫁衣襯著肌膚如雪悦陋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天筑辨,我揣著相機與錄音俺驶,去河邊找鬼。 笑死棍辕,一個胖子當著我的面吹牛暮现,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楚昭,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼栖袋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抚太?” 一聲冷哼從身側響起塘幅,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尿贫,沒想到半個月后晌块,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡帅霜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年匆背,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片身冀。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡钝尸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搂根,到底是詐尸還是另有隱情珍促,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布剩愧,位于F島的核電站猪叙,受9級特大地震影響,放射性物質發(fā)生泄漏仁卷。R本人自食惡果不足惜穴翩,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锦积。 院中可真熱鬧芒帕,春花似錦、人聲如沸丰介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至带膀,卻和暖如春志珍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垛叨。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工碴裙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人点额。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像莺琳,于是被迫代替她去往敵國和親还棱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容