Try the Compose way
Jetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose.

It is a common misconception that using the basic layout structures leads to the most efficient
layouts. However, each widget and layout you add to your application requires initialization,
layout, and drawing. For example, using nested instances of LinearLayout
can
lead to an excessively deep view hierarchy. Furthermore, nesting several instances of
LinearLayout
that use the layout_weight
parameter can be especially
expensive as each child needs to be measured twice. This is particularly important when the layout
is inflated repeatedly, such as when used in a ListView
or GridView
.
In this lesson you'll learn to use Hierarchy Viewer and Lint to examine and optimize your layout.
The Android SDK tools include a tool called Hierarchy Viewer that allows you to analyze your layout while your application is running. Using this tool helps you discover bottlenecks in the layout performance.
Hierarchy Viewer works by allowing you to select running processes on a connected device or emulator, then display the layout tree. The traffic lights on each block represent its Measure, Layout and Draw performance, helping you identify potential issues.
For example, figure 1 shows a layout that's used as an item in a ListView
.
This layout shows a small bitmap image on the left and two stacked items
of text on the right. It is especially important that layouts that will be inflated multiple
times—such as this one—are optimized as the performance
benefits will be multiplied.
Figure 1. Conceptual layout for an item in a ListView
.
Hierarchy Viewer shows a list of available devices and their running components. Choose your component from the Windows tab, and click Hierarchy View to view the layout hierarchy of the selected component. For example, figure 2 shows the layout for the list item illustrated by figure 1.
Figure 2. Layout hierarchy for the layout in figure 1,
using nested instances of LinearLayout
.
Because the layout performance above slows down due to a nested LinearLayout
,
the performance might improve by flattening the layout—make
the layout shallow and wide, rather than narrow and deep. A RelativeLayout
as
the root node allows for such layouts. So, when this design is converted to use
RelativeLayout
, you can see that the layout becomes a two-level hierarchy. Inspection
of the new layout looks like this:
Figure 3. Layout hierarchy for the layout in figure 1,
using RelativeLayout
.
The benefits, as small as they might seem, are multiplied several times because this layout is used for every item in a list.
Most of the difference is due to the use of layout_weight
in the
LinearLayout
design, which can slow down the speed of measurement. It is just one
example of how each layout has appropriate uses and you should carefully consider whether using
layout weight is necessary.
In some complex layouts, the system may waste effort measuring the same UI element more than once. This phenomenon is called double taxation. For more information about double taxation and how to prevent it, see Performance and View Hierarchies.
It is always good practice to run the lint tool on your layout files to search for possible view hierarchy optimizations. Lint has replaced the Layoutopt tool and has much greater functionality. Some examples of lint rules are:
LinearLayout
which contains an
ImageView
and a TextView
can be more efficiently handled as a compound drawable.FrameLayout
is the root of a layout and does not provide background or
padding etc, it can be replaced with a merge tag which is slightly more efficient.ScrollView
or a root layout, and does not have a background, can be removed
and have its children moved directly into the parent for a flatter and more efficient layout hierarchy.RelativeLayout
or GridLayout
to improve performance.
The default maximum depth is 10.Another benefit of Lint is that it is integrated into Android Studio. Lint automatically runs whenever you compile your program. With Android Studio, you can also run lint inspections for a specific build variant, or for all build variants.
You can also manage inspection profiles and configure inspections within Android Studio with the File>Settings>Project Settings option. The Inspection Configuration page appears with the supported inspections.
Figure 4. Inspection Configuration
Lint has the ability to automatically fix some issues, provide suggestions for others and jump directly to the offending code for review.
For further information related to this lesson, see XML Layouts and Layout Resource.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2023-05-11 UTC.