我有一个小项目,我想在几次重用某个UI组件,所以我通过扩展ViewGroup创建了一个小部件。在该ViewGroup中,我在一个包含LinearLayout内的TextView的视图中膨胀,并通过addView将该膨胀的视图添加到ViewGroup。
外部LinearLayout完美展开,但当我通过Hierarchy Viewer查看时,内部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>
爪哇:
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值的大小,但它没有帮助。
答案 0 :(得分:109)
请记住:
getHeight()
和getWith()
返回0
如果尚未绘制组件 。
要在绘制之前找到View
的宽度和高度:
首先致电measure
view.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED)
现在,您可以使用getMeasuredWidth
获取宽度,使用getMeasuredHeight
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
我已发布了更多想法:How to get width/height of a View
答案 1 :(得分:4)
1)以下是在您的手机上使用Hierarchy Viewer的一些链接。
http://developer.android.com/guide/developing/debugging/debugging-ui.html
以及您需要的课程:
http://github.com/romainguy/ViewServer
2)您还可以使用include标记重用布局:
<include android:id="@+id/your_id" layout="@layout/layout_name" />
答案 2 :(得分:1)
所以,我在这个上放了一笔赏金,这就是我找到的。
使用null
引用进行充气是一个坏主意(TM)。从本质上讲,该View将无法获得所需的正确布局参数(其父级设置了一大堆它们,涉及一大堆魔术/逻辑)。因此,膨胀为null意味着没有父项,也没有继承的布局参数。一个可以手动设置一些这些参数,但由于涉及到魔法,它可能无法解决您的问题。
我提出的“解决方案”涉及到;使用include(当你知道你需要多少时)并将它们拉入代码,或者膨胀到父级(当你需要真正的动态,N个东西时)。当然,你膨胀的XML会发生ID冲突,所以我通过抓住最后一个孩子(例如getChildAt(getChildCount() - 1)来解决这个问题,等等。
答案 3 :(得分:0)