Defining a percentage width for a LinearLayout?

AndroidAndroid Layout

Android Problem Overview


I want to define a percentage width (70%) for a LinearLayout that contains some buttons, so that I can center it and so that the child buttons can fill_parent. Here's a picture showing what I mean:

example

My current layout looks like this:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:id="@+id/layoutContainer" android:orientation="vertical">
	<LinearLayout android:layout_width="fill_parent"
		android:id="@+id/barContainer" android:orientation="horizontal"
		android:layout_height="40dp" android:background="@drawable/titlebackground">
		<ImageView android:id="@+id/barLogo" android:src="@drawable/titlelogo"
			android:layout_gravity="center_vertical" android:adjustViewBounds="true"
			android:layout_height="25dp" android:layout_width="wrap_content"
			android:scaleType="fitXY" android:paddingLeft="5dp"></ImageView>
	</LinearLayout>
	<TextView android:layout_height="wrap_content"
		android:layout_width="fill_parent" android:gravity="center_horizontal"
		android:id="@+id/searchTip" android:text="@string/searchTip"
		android:paddingTop="10dp" android:paddingBottom="10dp"></TextView>
	<LinearLayout android:layout_height="wrap_content"
		android:id="@+id/linearLayout1" android:orientation="vertical" android:layout_width="wrap_content">
		<Button android:text="Button" android:id="@+id/button1"
			android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
		<Button android:layout_width="wrap_content" android:id="@+id/button2" android:layout_height="wrap_content" android:text="Button"></Button>
		<Button android:layout_width="wrap_content" android:id="@+id/button3" android:layout_height="wrap_content" android:text="Button"></Button>
	</LinearLayout>
</LinearLayout>

The LinearLayout im referring to has the id: linearLayout1. How do I do this?

Android Solutions


Solution 1 - Android

You have to set the weight property of your elements. Create three RelativeLayouts as children to your LinearLayout and set weights 0.15, 0.70, 0.15. Then add your buttons to the second RelativeLayout(the one with weight 0.70).

Like this:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:id="@+id/layoutContainer" android:orientation="horizontal">
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.15">
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.7">
        
        <!-- This is the part that's 70% of the total width. I'm inserting a LinearLayout and buttons.-->   
            <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:orientation="vertical">
                
                <Button 
                    android:text="Button1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                </Button>
                <Button
                    android:text="Button2"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                </Button>
                <Button
                    android:text="Button3"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                </Button>
                
            </LinearLayout>
        <!-- 70% Width End-->
        
    </RelativeLayout>
    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.15">
    </RelativeLayout>
</LinearLayout>

Why are the weights 0.15, 0.7 and 0.15? Because the total weight is 1 and 0.7 is 70% of the total.

Result:

enter image description here

Edit: Thanks to @SimonVeloper for pointing out that the orientation should be horizontal and not vertical and to @Andrew for pointing out that weights can be decimals instead of integers.

Solution 2 - Android

i know another solution, that work with weight:

<?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="10" 
              android:gravity="center_horizontal">

    <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" 
            android:layout_weight="7">
    </LinearLayout>
</LinearLayout>

Solution 3 - Android

Hope this can help

http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layoutContainer" android:orientation="vertical">

<LinearLayout android:layout_width="fill_parent"
	android:layout_height="fill_parent" android:orientation="horizontal">

	<LinearLayout android:layout_width="0dip"
		android:layout_height="wrap_content" android:orientation="horizontal"
		android:id="@+id/linearLayout_dummy1" android:layout_weight=".15">
	</LinearLayout>


	<LinearLayout android:layout_height="wrap_content"
		android:id="@+id/linearLayout1" android:orientation="vertical"
		android:layout_width="0dip" android:layout_weight=".7">
		<Button android:text="Button" android:id="@+id/button1"
			android:layout_width="wrap_content" android:layout_height="wrap_content"
			android:layout_gravity="center">
		</Button>
		<Button android:layout_width="wrap_content" android:id="@+id/button2"
			android:layout_height="wrap_content" android:text="Button"
			android:layout_gravity="center"></Button>
		<Button android:layout_width="wrap_content" android:id="@+id/button3"
			android:layout_height="wrap_content" android:text="Button"
			android:layout_gravity="center"></Button>
	</LinearLayout>

	<LinearLayout android:layout_width="0dip"
		android:layout_height="wrap_content" android:orientation="horizontal"
		android:id="@+id/linearLayout_dummy2" android:layout_weight=".15">
	</LinearLayout>

</LinearLayout>

(1) Set layout_width to "0dip" (2) Set the layout_height to .xx (% you want)

Solution 4 - Android

I think Emiam's approach is right. But also agree with Simon Veloper (one of commentators of Emiam's answer) : When we need the buttons in 70% of width, we should use horizontal orientation for Linearlayout and set width of each Relativelayout to 0dip and their weight as specified So I suggest this version :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:id="@+id/layoutContainer" android:orientation="horizontal">
    <RelativeLayout
            android:layout_width="0dip"
            android:layout_height="fill_parent"
            android:layout_weight="3">
    </RelativeLayout>
    <RelativeLayout
            android:layout_width="0dip"
            android:layout_height="fill_parent"
            android:layout_weight="14">

            //This is where you add buttons. You can make them "fill_parent".
    </RelativeLayout>
    <RelativeLayout
            android:layout_width="0dip"
            android:layout_height="fill_parent"
            android:layout_weight="3">
    </RelativeLayout>
</LinearLayout>

Solution 5 - Android

As a latest update to android in 2015, Google has included percent support library

> com.android.support:percent:23.1.0

You can refer to this site for example of using it

> https://github.com/JulienGenoud/android-percent-support-lib-sample

Gradle:

dependencies {
    compile 'com.android.support:percent:22.2.0'
}

In the layout:

<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">

    <View
        android:id="@+id/top_left"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_alignParentTop="true"
        android:background="#ff44aacc"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="70%" />

    <View
        android:id="@+id/top_right"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/top_left"
        android:background="#ffe40000"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="30%" />


    <View
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_below="@+id/top_left"
        android:background="#ff00ff22"
        app:layout_heightPercent="80%" />
</android.support.percent.PercentRelativeLayout>

Solution 6 - Android

Use new percentage support library

compile 'com.android.support:percent:24.0.0'

See below example

<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">
     <ImageView
         app:layout_widthPercent="50%"
         app:layout_heightPercent="50%"
         app:layout_marginTopPercent="25%"
         app:layout_marginLeftPercent="25%"/>
 </android.support.percent.PercentRelativeLayout>

For More Info Tutorial1 Tutorial2 Tutorial3

Solution 7 - Android

You can't define width/height/margins/... using percents in your XML. But what you would want to use is the "weight" attribute, which is, IMO, the most similar thing.

Another method would be to set the sizes programmatically after you inflate the layout in your code, by getting the size of your screen and calculating needed margins.

Solution 8 - Android

You can use layout_weight properties. If you want to take 70% of parent width you must set child layout_width property value 0dp, like android:layout_width="0dp"

Solution 9 - Android

I solved a similar issue applying some padding to the LinearLayout like this:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/app_background"
    android:padding="35dip">

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/black">

</RelativeLayout>
</LinearLayout>

This probably won't give you an exact percentage but can be easily graduated and avoid extra unnecessary layout elements.

Solution 10 - Android

Google introduced new API called PercentRelativeLayout

Add compile dependency like

compile 'com.android.support:percent:22.2.0'

in that PercentRelativeLayout is what we can do percentagewise layout

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionsoren.qvistView Question on Stackoverflow
Solution 1 - AndroidEmir KuljaninView Answer on Stackoverflow
Solution 2 - AndroidtahaView Answer on Stackoverflow
Solution 3 - Androidmobile app BeginnerView Answer on Stackoverflow
Solution 4 - AndroidHamlet KraskianView Answer on Stackoverflow
Solution 5 - AndroidDanny TeoView Answer on Stackoverflow
Solution 6 - AndroidMagesh PandianView Answer on Stackoverflow
Solution 7 - AndroidLyrkanView Answer on Stackoverflow
Solution 8 - AndroidSazzad Hissain KhanView Answer on Stackoverflow
Solution 9 - AndroidSCabralOView Answer on Stackoverflow
Solution 10 - AndroidNivedhView Answer on Stackoverflow