android關於LinearLayout的坑

Panda.X發表於2017-07-01

以前開始學的時候

我們都知道如果LinearLayout的佈局方向有兩種

1.horizontal(水平方向佈局)

2.vertical(垂直方向佈局)

如果LinearLayout的佈局方向是horizontal,內部的控制元件就絕對不能將寬度指定為match_parent,因為這樣的話,單獨一個控制元件就會將整個水平方向佔滿,其他的控制元件就沒有可以放置的位子了,同樣道理如果LinearLayout的佈局方向是vertical,內部的的控制元件就不能將高度指定為mach_parent

這段話看似很好理解,我也自以為是的很快就理解了,實則不然

今天寫程式碼突然發現一個“BUG”

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="horizontal">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1">
    </Button>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="2">
    </Button>
</LinearLayout>
按道理說,上面的程式碼由於我的第二Button指定了layout_width="match_parent"所以只能看到第二個Button,因為第一個Button被第二個Button擠掉了

但是出來的效果卻讓我大吃一驚,如下圖

我勒個去。。。應該是以下的程式碼才會出現上圖的效果啊

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="horizontal">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1">
    </Button>
    <Button
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="2">
    </Button>
</LinearLayout>
無奈,讓我冥思苦想一個晚上

終於開竅

第一段程式碼導致這種效果的合理解釋是

因為第一個按鈕已經佔據了一部分空間,第二個按鈕再設定layout_width="match_parent"的時候,只會擠掉排列在第二個按鈕之後的控制元件控制元件,不會擠掉之前控制元件的空間,於是,抱著這個想法我又開始新一輪的嘗試

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="horizontal">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1">
    </Button>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="2">
    </Button>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="3">
    </Button>
</LinearLayout>
果不其然,上面程式碼的效果與圖1一毛一樣,看來我的推測是正確的


結論:當時LinearLayout佈局時,最後一個控制元件指定是laytout_width="match_parent"就會佔滿剩餘的所有空間,但是如果後期再想在這個所謂的“最後一個控制元件”後面再加一個控制元件,這個控制元件是不會顯示出來的,還是按照標準的寫法,把layout_width或者layout_height的值設定為“0dp”再加上layout_weight="1"的這種寫法比較保險,不要為了一時偷懶導致後患無窮

相關文章