I am trying to messing around with the Android layout weight attributes.
I want a vertical layout with "3 child layouts" The first will take 25% of the space, the second 50%, and the last 25% of the space. When I try to add to the last layout, everything just not working. What should be the weight for each of these layouts?
I get the weight attributes to work fine with just 2 layouts/elements and understand how it works but when I try with 3 I get a problem.
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:orientation="horizontal"
android:weightSum="100" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="25" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="50" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="25" >
</LinearLayout>
</LinearLayout>
try using this code.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100">
<LinearLayout
android:layout_width="0dp"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="25">
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="50" >
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_weight="25">
</LinearLayout>
</LinearLayout>
Make sure that the android:width
attribute is set to 0dp for all child layouts, and then make sure that you have a weight
specified. If you want a more detailed explanation, you will need to paste your code.
There is another way of achieving this result using less complicated layout tree. You may use PercentRelativeLayout
from Percent Support Library for Android. Just import this library to your project, and check out the following code:
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_height="100dp"
android:layout_toLeftOf="@+id/middle"
android:layout_weight="25"
android:orientation="vertical"
app:layout_widthPercent="25%">
</LinearLayout>
<LinearLayout
android:id="@+id/middle"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:layout_weight="50"
android:orientation="vertical"
app:layout_widthPercent="50%">
</LinearLayout>
<LinearLayout
android:layout_height="100dp"
android:layout_toRightOf="@+id/middle"
android:layout_weight="25"
android:orientation="vertical"
app:layout_widthPercent="25%">
</LinearLayout>
</android.support.percent.PercentRelativeLayout>
Well, first, weight can only be applied to LinearLayouts
or any layout that derives from LinearLayout
. The weights of the children should be a percentage of whatever the weightSum
attribute is for LinearLayout
. If you set weightSum=1
of your parent LinearLayout
, then the percentage of your first child should be .25, second child should be .5, and third child should be .25.
EDIT: Like javram said. You need to set either the width or height to 0dp
depending on whether the LinearLayout
is horizontal orientation or vertical orientation respectively.
EDIT 2: Also, I don't think you have to actually specify weightSum
. It helps, but I believe LinearLayout
will divide the children up base solely on how their own respective weights are. If child 1's weight is twice as large as child 2's weight, then child 2 will be double child 1 on screen. Thus in your case just make sure child 1 & 3 have the same weight while child 2 has double the value the other two.
LinearLayout java1,java2,java3;
java1=(LinearLayout)findViewById(R.id.java1);
java2=(LinearLayout)findViewById(R.id.java2);
java3=(LinearLayout)findViewById(R.id.java3);
DisplayMetrics ds=new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(ds);
int height=ds.heightPixels;
Log.d(TAG,""+height);
java1.getLayoutParams().height=height/4;
java2.getLayoutParams().height=height/2;
java3.getLayoutParams().height=height/4;