【问题标题】:Android TextView has height and width of 0Android TextView 的高度和宽度为 0
【发布时间】:2020-01-03 07:24:44
【问题描述】:

我有一个小项目,我想多次重用某个 UI 组件,所以我通过扩展 ViewGroup 创建了一个小部件。在那个 ViewGroup 中,我膨胀了一个在 LinearLayout 内包含 TextView 的视图,并通过 addView 将该膨胀视图添加到 ViewGroup 槽中。

当我通过 Hierarchy Viewer 查看时,外部 LinearLayout 完美地扩展了自身,但内部 TextView 具有 getHeight() = 0 和 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 中解决)。
  • 不,我不知道我能做到这一点。稍后我回来时会尝试。但是,我确实在我的小部件中尝试了 forceLayout() 几次,但没有帮助。
  • 也许您应该创建 LinearLayout.LayoutParams(int width, int height) 并将其设置为您的 TextView?
  • 我猜,你必须调用 measure(...,...)
  • TextView layout_width 缺少 d。这可能没有帮助。

标签: android


【解决方案1】:

记住:getHeight()getWidth()return 0 如果组件尚未绘制


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

  1. 第一次打电话measure

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

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

我在这里发布了更多想法:How to get width/height of a View

【讨论】:

  • 你已经做到了。提供了所有#android中最常见问题的单行答案
  • 哎呀,我从来没有在任何关于这个问题的答案中看到这个。
  • 谢谢。你救了我。
  • 这是一个很好的答案! +1!
【解决方案2】:

1) 以下是一些在您的开发手机上使用 Hierarchy Viewer 的链接。

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

以及您需要的课程:

http://github.com/romainguy/ViewServer

2) 你也可以像组件一样使用包含标签重用布局:

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

【讨论】:

    【解决方案3】:

    所以,我悬赏了这个,这就是我发现的。

    使用null 引用膨胀是一个坏主意(TM)。从本质上讲,该 View 不会获得它需要的正确布局参数(它的父级设置了一大堆参数,涉及一大堆魔法/逻辑)。所以膨胀为 null 意味着没有父母,也没有继承的布局参数。 可以手动设置其中的一些参数,但由于涉及的魔法,它可能无法解决您的问题。

    我提出的“解决方案”涉及;使用包含(当你知道你需要多少时)并将它们拉入代码中,或者膨胀到父级(当你需要真正的动态时,N 个东西)。当然,你膨胀的 XML 会有 ID 冲突,所以我通过抓取我正在寻找的任何东西的最后一个孩子(例如 getChildAt(getChildCount()-1) )来解决它,等等。

    【讨论】:

      【解决方案4】:

      您是否尝试将自己作为根传递:

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

      因为您将成为符合 the javadoc spec 的视图的父级。

      【讨论】:

      • 请务必删除addView(view) 行,否则尝试将视图分配给另一个父级时会出现运行时异常。
      猜你喜欢
      • 1970-01-01
      • 2014-01-24
      • 2020-03-11
      • 1970-01-01
      • 2014-06-12
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多