安卓TextView的高度和宽度为0。

33

我有一个小项目,希望重复使用某个 UI 组件,因此我通过扩展 ViewGroup 创建了一个小部件。在该 ViewGroup 中,我填充了一个包含 TextView 的 LinearLayout 视图,并将该填充视图通过 addView 添加到了 ViewGroup 中。

外部 LinearLayout 完美地扩展自身,但当我通过 Hierarchy Viewer 查看时,内部 TextView 的 getHeight() 和 getWith() 均为 0。奇怪的是,layout_height 和 layout_width 是我在 xml 中给它们的值。

我这里没有代码,但看起来应该是这样的:

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);  

我尝试将我的文本视图的大小设置为fill_parent,但没有帮助。

你尝试在Hierarchy Viewer中强制执行布局请求了吗?如果这样做可以使TextView显示出来,那么你可能面临着一个框架错误(应该在API>8 AFAIK中解决)。 - bigstones
不,我不知道我可以这样做。等会儿回来后会尝试一下。但是我之前在我的小部件中尝试了几次forceLayout(),但没有帮助。 - MrFroYo
也许你应该创建一个LinearLayout.LayoutParams(int width, int height)并将其设置给你的TextView? - Anton Derevyanko
我猜你需要调用measure(...,...)函数。 - Damian Kołakowski
2
TextView的“layout_width”缺少“d”。这可能没有帮助。 - thegrinner
显示剩余2条评论
4个回答

118

请记住:getHeight()getWidth()如果组件还没有被绘制,它们将返回0


要在View被绘制之前找到其宽度和高度:

  1. 首先调用measure

view.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED)
  • 现在你可以使用getMeasuredWidth获取宽度,使用getMeasuredHeight获取高度

  • int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
    
    我在这里发布了更多的想法:如何获取View的宽度/高度

    16
    你已经做到了。提供了一句话回答所有 #android 中最常见的问题。 - nograde
    2
    哎呀,我从来没有在任何关于这个问题的答案中看到过这个。 - Mathijs Segers
    谢谢。你救了我。 - Vikrant_Dev
    这是一个很棒的答案!+1! - Nari Kim Shin

    4

    1

    所以,我在这个问题上设置了赏金,并找到了以下解决方案。

    使用null引用进行膨胀是一个坏主意(TM)。基本上,该视图将无法获得它所需的正确布局参数(其父级设置了许多这些参数,并涉及许多魔法/逻辑)。因此,膨胀为null意味着没有父级和没有继承的布局参数。您可以手动设置其中一些参数,但由于涉及魔法,可能无法解决您的问题。

    我想出的“解决方案”包括:使用include(当您知道需要多少个时)并将它们拉入代码中,或者膨胀到父级(当您需要真正的动态N个时)。当然,您膨胀的XML将具有ID冲突,因此我通过获取我正在查找的任何内容的最后一个子项(例如getChildAt(getChildCount()-1))来处理它等。


    0

    你尝试过将自己传递为根用户吗:

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

    由于您将成为符合javadoc规范的此视图的父级。


    一定要删除 addView(view) 这一行代码,否则会在尝试将一个视图分配给另一个父级时抛出运行时异常。 - Jason Robinson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接