2014-04-17 56 views
4

我有一個垂直的LinearLayout LL_p和兩個子水平的LinearLayouts LL_1和LL_2,它們又有它們自己的子項。基於LL_1和LL_2的可見內容,我想動態地改變它們在LL_p中的相對權重。我已經有了一個xml佈局,其中有很多細節我不想丟失,所以我只需要對權重進行增量更改。我怎麼做?下面是我的XML編程設置LinearLayout的子項的權重

… 
<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight=「0.2」 
     android:orientation="vertical" > 

     <LinearLayout 
      android:id="@+id/ll_1」 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.55" 
      android:background="@drawable/some_image」 
      android:orientation="vertical" > 

      <!—- a number of includes —> 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/ll_2」 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.45" 
      android:layout_marginBottom="@dimen/dim_1」 
      android:background="@color/some_color」 
      android:orientation="horizontal" > 

      <!—- a number of children —> 
     </LinearLayout> 
    </LinearLayout> 

</LinearLayout> 

所以在Java活動課我想我需要下面的方法,但我需要幫助完成它。請注意,我沒有實例化新的佈局參數,因爲這會導致我失去我的xml佈局細節;相反,我使用getLayoutParams從xml中獲取一組。那麼我如何才能使體重改變到所獲得的佈局呢?

private void adjustMYLayout(boolean flip) { 
    LayoutParams layout1 = mLL1.getLayoutParams(); 
    LayoutParams layout2 = mBLL2.getLayoutParams(); 
    //now what? 
    if(flip) {//set one weight system 
    }else { 
     //set other weight system 
    } 
} 

更新@nKn

private void adjustMYLayout(boolean flip) { 

    if (flip) { 
    mLL1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.8f)); 
     mLL2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.2f)); 
    } else { 
    mLL1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.55f)); 
    mLL2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT, 0.45f)); 
    } 
} 
+0

可能重複的[Android的線性佈局權重編程](http://stackoverflow.com/questions/19158327/android-linear-layout-weight-programatically) – starkej2

回答

4

可以實現,通過聲明一個LinearLayout.LayoutParams對象

tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f)); 

第三個參數(1f)是佈局的重量(在這種情況1(f代表float))。

+0

由電視我的意思是mLL1或mLL2。但那麼我怎麼樣關心失去現有的細節設置在XML說mLL1?細節如背景,填充等。我相信我知道如何去做你的建議。但這樣做意味着從頭開始,以便我必須重新傳遞一切:邊距,背景等。這就是我想要避免的。還是我誤會了? –

+0

是的,對不起,這些將是你的'mLLX'。你不應該失去佈局文件中定義的任何值,而是'layout_height','layout_width'和'layout_height',因爲你只是重寫了這個。剩下的屬性應該像你在佈局文件中定義一樣。 – nKn

+0

謝謝。但是你的方式實際上已經失去了我的marginBottom,這意味着我需要做一些工作來將10dp改爲像素,然後用'setMargins(0,0,0,convertedDp2Px)'將它們加回來。我的問題是專門避免這樣的「混亂」。我希望android提供了一個更好的設施來改變權重。 –

相關問題