Home » Android » android – How does setting baselineAligned to false improve performance in LinearLayout?

android – How does setting baselineAligned to false improve performance in LinearLayout?

Posted by: admin March 10, 2020 Leave a comment


I was just building some UI in xml, and Lint gave me a warning and said to set android:baselineAligned to false to improve performance in ListView.

The docs for the Lint changes that added this warning say

Layout performance: Finds LinearLayouts with weights where you should
set android:baselineAligned=”false” for better performance, and also
finds cases where you have nested weights which can cause performance

Can somebody explain why this improves performance, specifically when weight is involved?

How to&Answers:

By setting android:baselineAligned="false" , you’re preventing the extra work your app’s layout has to do in order to Align its children’s baselines; which can obviously increase the performance. (Fewer unnecessary operations on UI => Better performance)


how android:baselineAligned="false" help . It may not be the answer but help to get concept.

I’ve just managed to get 3 items (icon, text, button) centered
vertically in horizontal LinearLayout.

This may seem simple, but in reality specifying
android:gravity=”center_vertical” as LinearLayout attribute is not
enough – icon is centered, but text and button are not. This is
because (presumably) text have a baseline, and centering algorithm
uses it instead of ‘real’ vertical center. But what is worse – button
(which comes next to text) is centered using text’s baseline!

Specifying android:baselineAligned=”false” in LinearLayout turns this
off, and everything centers correctly.


// Baseline alignment requires to measure widgets to obtain the
                // baseline offset (in particular for TextViews). The following
                // defeats the optimization mentioned above. Allow the child to
                // use as much space as it wants because we can shrink things
                // later (and re-measure).
                if (baselineAligned) {
                    final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    child.measure(freeSpec, freeSpec);