1

我試圖使用線性佈局的layout_weight作爲scrollview內部的高度。不過,我發現layout_weight只能用於fillViewPort = true,並且如果有足夠的剩餘空間可用於展開linear_weight。當ScrollView中的佈局大於ScrollView時,layout_weight不起作用

我已經在下面列出了三個例子,我想讓textView在#2和#3中與xml中的#1一樣大小。 正如你可以在鏈接中看到的那樣,在#2,#3中,textView被自動更改。

這裏是我的例子。 TextViews和Buttons被包含在一個LinearLayout內部,然後在一個scrollView中。

1. Layout_weight相對於父項完美工作。 (工作)

http://s22.postimg.org/v0gl2tmyp/Screen_Shot_2013_06_26_at_4_30_51_PM.png

2. Layout_weight工作相對於剩餘空間並且不是父。(不工作)

http://s22.postimg.org/sx65v5n5t/Screen_Shot_2013_06_26_at_4_30_44_PM.png忽略(不工作)

3 Layout_weight

http://s22.postimg.org/ibmaj5gu9/Screen_Shot_2013_06_26_at_4_40_32_PM.png

這是我的#3的xml代碼。 #2和#1基本上是相同的代碼,只有少量按鈕或沒有按鈕。

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scroller" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:weighSum="1" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:weightSum="10" > 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 


     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="6" 
      android:background="#AAABBB" 
      android:text="hello" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="3" 
      android:background="#BBBAAA" 

      android:text="hello" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="5" 
      android:background="#AAABBB" 

      android:text="hello" /> 
    </LinearLayout> 

</ScrollView> 
+0

(工作案例)http://s22.postimg.org/v0gl2tmyp/Scr​​een_Shot_2013_06_26_at_4_30_51_PM.png –

+0

您可以爲這三種方案添加xml嗎?這將有助於更清楚你正在努力完成什麼。 –

+0

什麼不適合你?或者你想讓其他人完成整個佈局? –

回答

2

重量按照設計的方式工作。也許不是你希望他們「工作」的方式,但說他們「不工作」是不準確的。想一想你的第三種情況,你會期望TextView是什麼樣的大小?權重是可用空間的百分比(不是父級的總大小)。 scrollview和linearlayout至少是屏幕的大小,否則是所有子視圖的總和。所以,如果你的孩子的看法超出屏幕的大小(包括那些沒有權重),多少空間你希望將要分配給剩餘的視圖(與0dp和權重的)?問題的關鍵是空間量是任意的,Android將不會嘗試假設你想要多大的空間,因爲它知道沒有可能的方式。

TL; DR - 您textviews設置了minHeight(以dp)來處理,你有太多的按鈕的情況。

+1

是的,你是對的。我查看了線性佈局的源代碼,它僅適用於**剩餘空間**,並且任何超出空間的佈局都將設置爲wrap_content。感謝您的答覆。我希望有更好的方式來操作ScrollView中的子佈局。 –

1

嘗試在layout_weight的元素上設置layout_height =「0dp」。封閉的佈局對象將使用任何可用空間來儘可能多地增長它們。

另外您對weightSum的使用有點疑問。通常weightSum應該> =所包含視圖的總重量。您有一個weightSum,其中沒有任何直接封閉的視圖有重量,而另一個視圖的總重量超過weightSum。第二種情況會導致奇怪的行爲。

+0

嗨感謝您的回覆。我和意見權重較大的比weighsum是因爲要進行測試,看它是否能夠使在滾動型較大的虛擬維度。但是,事實證明layout_weight只能使用**剩餘空間**。所以超越界限只會被裁剪。 –

2

這些圖像正是我期望爲您的xml看到的。

這可能會幫助您:

  1. 當系統佈局把View S使用的權重方法在屏幕上,它根據重量,而不是總分配只有備用空間空間。因此,爲了讓它根據權重分配總空間(這是大多數人直觀預期的),您必須將您希望它的維度設置爲0dip。因此,對於那些Button S和TextView是你需要設置

    android:layout_height = "0dip" 
    
  2. 您可能還需要強制ScrollView以填充視口停止一切蜷縮起來。見here

    android:fillViewport="true" 
    
  3. 個人觀察。有時權重看起來反過來(即更小的權重給予更多的空間)。因人而異。

+0

嗨感謝您的迴應。我把按鈕放在那裏,使佈局更大,沒有其他原因。我只對使父級佈局的textViews比例感興趣。另外,我編輯了代碼,我不小心粘貼了錯誤的代碼,但無論如何,情況#3不起作用。 –

+0

我有點困惑。您爲佈局3顯示的圖片正是我期望xml提供的內容。你在期待什麼? –

+0

我希望textViews相對於重量和其父增長。因此,textView#1將增長60%,textView#2將增長30%,textView#3將增加50%的高度。 –