Home » Android » Android TextView has height and width of 0

Android TextView has height and width of 0

Posted by: admin April 23, 2020 Leave a comment


I have a small project where I want to reuse a certain UI component a few time so I created a widget by expanding a ViewGroup. In that ViewGroup I inflated a view that contained a TextView inside a LinearLayout and added that inflated view to the ViewGroup trough addView.

The outer LinearLayout expands itself perfectly but the inner TextView have getHeight() = 0 and getWith() = 0 when I view it through Hierarchy Viewer. The strange thing is that layout_height and layout_width is the values I gave them in my xml.

I don’t have the code here but it looked something like this:



        android:text="random text.."  
        android:layout_height="50px" />  


class MyWidget extends ViewGroup {

//In constructor  
myView = View.inflate(context, R.layout.xml, null);  

//In layout  
myView.layout(l, t, r, b);  

I have tried to give my text view fill_parent values for size but it didn’t help.

How to&Answers:

Remember:getHeight() and getWidth()return 0 if components are not drawn yet.

To find the width And height of a View before it being drawn:

  1. First call measure

  2. Now you can get width using getMeasuredWidth and height using getMeasuredHeight

    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();

I have posted some more ideas here: How to get width/height of a View


1) Here is some links to use Hierarchy Viewer on your dev phone.


and the class you’ll need:


2) You can also reuse layout like a component with the include tag:

<include android:id="@+id/your_id" layout="@layout/layout_name" />


So, I put a bounty on this one, and here is what I’ve found.

Inflating with a null reference is A Bad Idea(TM). Essentially, that View won’t get the proper layout parameters it needs (its parent sets a whole bunch of them, with a whole bunch of magic/logic involved). So inflating into null means no parents, and no inherited layout parameters. One can manually set a number of these parameters, but due to the magic involved it might not solve your problem.

The “solution(s)” that I’ve come up with involve; using include (when you know how many you need) and pulling them into code, or inflating to a parent (when you need true dynamic, N things). And of course, the XML you inflate will have ID collisions, so I go about it by grabbing the last child (e.g. getChildAt(getChildCount()-1) ) of whatever I’m looking for, etc.


Did you try passing yourself as the root:

View.inflate(context, R.layout.xml, this); 

Since you will be the parent of this View that complies with the javadoc spec.