33

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.

7
  • have you tried in Hierarchy Viewer to force a layout request? if it makes the textview show up, then you're probably facing a framework bug (that should be solved in API > 8 AFAIK).
    – bigstones
    Commented Apr 28, 2011 at 14:42
  • No I didn't know I could do that. Will try when I get back later. I did however try a forceLayout() from within my widget a few times and that didn't help.
    – MrFroYo
    Commented Apr 28, 2011 at 15:23
  • Maybe you should create LinearLayout.LayoutParams(int width, int height) and set it to your TextView? Commented Jul 11, 2011 at 13:24
  • I guess, you have to call measure(...,...) Commented Jul 12, 2011 at 13:52
  • 2
    The TextView layout_width is missing a d. That probably doesn't help.
    – thegrinner
    Commented Jul 12, 2011 at 14:31

4 Answers 4

118

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

2
  • 16
    you have done it. provided the one line answer to the most common question in all of #android
    – nograde
    Commented Apr 17, 2012 at 18:23
  • 2
    Gee I never saw this one at any answer regarding this issue. Commented Feb 10, 2014 at 14:24
4
+25

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

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.

0

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.

1
  • Be sure to remove the addView(view) line or you'll get a runtime exception for attempting to assign a view to another parent. Commented Jul 12, 2011 at 17:14

Not the answer you're looking for? Browse other questions tagged or ask your own question.