2012-11-28 33 views
0

我知道下面的XML將工作,但有什麼辦法來實現這一同樣的效果?在XML的Android漿紗查看基於父視圖大小

.... 
<LinearLayout 
    android:layout_width="match_parent * 5" 
    android:layout_height="match_parent" /> 
.... 

要解釋,我想達到的效果是讓一個子佈局的X倍它的大小的父佈局,其中X是浮動。在XML例子,我用5

的影響我想用這個是有一個滾動型爲Y的大小,並有它的內容視圖是Y * X的大小來創建。

+3

要實現這一點,你必須寫一個自定義佈局(擴展的ViewGroup。) –

回答

1

據我所知,沒有辦法通過XML佈局來實現這一點。您可以在您的活動中添加以下代碼,以便更改子視圖的高度。請注意,一旦android已完成活動佈局,視圖的大小就已知。所以你可以添加一個監聽器來知道什麼時候佈局已經準備就緒,並且所有的尺寸都已知。我與賽義德·薩希德·阿里認爲,不能容納大的孩子在較小的父母,但據滾動型而言這個代碼應工作:

final ViewGroup parentView = findViewById(R.id.parentView); 
    final View childView = parentView.findViewById(R.id.childView); 

    parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      float parentHeight = parentView.getHeight(); 

      ViewGroup.LayoutParams params = childView.getLayoutParams(); 
      params.height = (int)(parentHeight * 5); 

      childView.setLayoutParams(params); 
      //We want the listener to be called only the first time(in case it is initialized in onCreate()) 
      parentView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 
+0

這似乎是對我來說最好的選擇,但是,我想要做的和那個代碼做的是childView之間的一個區別。 childView對我來說實際上是一個ViewGroup(它是一個'LinearLayout')。然而,這段代碼顯然不適用於ViewGroup(但是如果我將childView更改爲以任意TextView爲目標,則它工作得很好)。有什麼建議麼? – MikeS

0

如何讓小孩適合小孩,即使通過編程也不可能。

如果你想的話,第一件事情就是你的父視圖必須有「wrap_內容」屬性,如果是,那麼你不能做X * 5的事情。

所以,你說的是不可能的。

+4

一個孩子可以比其母公司大,它的滾動型是如何工作的。 –

+0

同意羅曼。這實際上是這個目的的用途:用於輕鬆設置scrollview內容視圖。 – MikeS

+0

我同意,但ScrollView的子元素的可見區域將始終保持小於或等於ScrollView。 – Androider

0

如果你知道父母的大小將是什麼,你可以指定一個像素/ layout/width中的/ dp/dip/sp值。實際上,我會推薦這種方法,因爲它更簡單,而且對您而言爆炸的可能性更小。

否則,其實你可以得到像素寬度/高度父視圖調用的onDraw()之後。有人說,getWidth和getHeight在onW​​indowFocusChanged調用上工作,我以前成功地使用它來測量視圖。

你這樣做雖然風險一塌糊塗,因爲如果一個子視圖測量父,子視圖可以擴大,從而給你一個機會,父擴張(儘管match_parent可以防止這種情況)。然後你調整孩子的大小,使其大於父母,然後你測量父母的大小,這擴大了。因此,你會陷入一個試圖比父母更大的孩子的循環中,並且父母會重新調整以適應孩子,並且孩子會進一步擴大。