Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative to nested weights with LinearLayouts

I want to achieve the following:

enter image description here

It works with the following layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <fragment 
            android:name="com.bobjohn.DetailsMenuFragment"
            android:id="@+id/detailsMenuFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="6"
            />

        <fragment 
            android:name="com.bobjohn.SummaryFragment"
            android:id="@+id/summaryFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_margin="10dp"
            android:layout_weight="4"/>
    </LinearLayout>

    <TextView 
        android:layout_width="0dp"
        android:layout_weight="7"
        android:layout_height="fill_parent"
        android:text="Test Text"/>
</LinearLayout>

However, I get the warning about nested weights being bad for performance. I understand the error but I don't know how to express this layout in another way. What is the alternative?

like image 762
steprobe Avatar asked Jun 28 '12 09:06

steprobe


People also ask

Why would nesting weights be a potential performance issue?

Nested weights are bad for performance because: Layout weights require a widget to be measured twice. When a LinearLayout with non-zero weights is nested inside another LinearLayout with non-zero weights, then the number of measurements increase exponentially.

How do I stop nested weights on Android?

You could use RelativeLayout to avoid the nested weights. Nested weights are bad for performance because the number of measurements increase exponentially with each one nested.

What are nested weights?

The idea of nesting weights, which dates back to Roman times, was to increase the portability of weight sets by compacting an entire group of weights into a container. In the nested cup form, a series of weights shaped into cups are set one into the other, forming a stack which is stored within a house vessel.

How do you use relative layout?

Positioning Views. RelativeLayout lets child views specify their position relative to the parent view or to each other (specified by ID). So you can align two elements by right border, or make one below another, centered in the screen, centered left, and so on.


2 Answers

There are NEW updates in SUPPORT Libs, Please check Accepted Answer too.

Updated Answer :-

Whenever you create any view, It calls it's measure events to know the height width of view on the screen, If you are not using WRAP_CONTENT or FILL_PARENT or FIXEDSIZE and using Weights then it's becoming more complex to render your layout on the screen.

Means,

First your main layout is rendered and calls it's measure..then based on weight all child views calls it's measure events recursively so it consumes more time to load.

So, One should avoid nesting of weights.

Alternative to Nested weights :-

You should consider using different layout and drawable folder specific to different sizes. Write your views in your XML with specific height-width OR make it wrap_content and use specific background images OR make it fill_parent.

I believe that as developer we may be wrong several time, but as creator Android (Lint) they may be wrong only in rare case, should listen to those warnings to make your code better.


BELOW ANSWER WAS WRITTEN WITH LACK OF KNOWLEDGE ABOUT ANDROID LAYOUT

AFAIK, I think you have done right, this is the best written XML for the same. You have used the weight attribute perfectly as it should have been used. You just ignore the Warnings.

What is the alternative?

I have coded all my XML in the same way in my projects so This has been the best alternative to me,So I dont think there is any other alternative to CODE the XML to get Such layout until and unless you use RelativeLayout as parent layout with some fixed sizes height and width of the child views. Still I advice you keep it as it is.


I would have deleted this answer as I still don't completely know Android Layouts but keeping it to receive new comments and answer based on this

like image 180
MKJParekh Avatar answered Nov 09 '22 12:11

MKJParekh


Yes we have the alternative for nested LinearLayout weight by android's percent support library

Code and concept HERE !

GitHub Project HERE !

Consider this simple layout where I have totally avoided weight property of LinearLayout

Percent support library

<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">
    <TextView
        android:id="@+id/fifty_huntv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#ff7acfff"
        android:text="20% - 50%"
        android:textColor="@android:color/white"
        app:layout_heightPercent="20%"
        app:layout_widthPercent="50%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_toRightOf="@id/fifty_huntv"
        android:background="#ffff5566"
        android:text="80%-50%"
        app:layout_heightPercent="80%"
        app:layout_widthPercent="50%"
        />

</android.support.percent.PercentRelativeLayout>

Really awesome !!!

like image 29
Nitesh Tiwari Avatar answered Nov 09 '22 13:11

Nitesh Tiwari