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

Questions:

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:

xml:

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

    <TextView  
        android:text="random text.."  
        android:layout_with="200px"  
        android:layout_height="50px" />  
</LinearLayout>  

Java:

class MyWidget extends ViewGroup {
...

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

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

    view.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED)
    
  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

Answer:

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

http://developer.android.com/guide/developing/debugging/debugging-ui.html

and the class you’ll need:

http://github.com/romainguy/ViewServer

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

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

Answer:

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.

Answer:

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.