我不太清楚为什么我的自定义视图组不会将其文本视图呈现为其子线性布局:
这是我的视图组代码:
import android.content.Context;
import android.graphics.Color;
import android.graphics.RectF;
import android.view.View;
import android.view.ViewGroup;
public class noteLayout extends ViewGroup {
float leftOrientationSize = 0;
float rightOrientationSize=0;
public noteLayout(Context activityContext)
{
super(activityContext);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int numberOfChild = getChildCount();
for (int i = 0;i<numberOfChild;i++){
View childView = getChildAt(i);
float childHeight = (float) childView.getMeasuredHeight();
float childWidth = (float) childView.getMeasuredWidth();
RectF rect = new RectF();
rect.bottom = 300;
rect.top = 20;
rect.left = 50;
rect.right = (getWidth()/2)-20;
childView.layout((int) rect.left, (int) rect.top, (int) rect.right, (int) rect.bottom);
}
}
}
我创建了一个带有textview的简单线性布局。此文件位于xml中,称为test3。
此外,以下代码用于将test3布局添加到自定义视图组中。
private void layoutNoteView() {
noteLayout noteLayout = new noteLayout(this);
noteLayout.addView((View) getLayoutInflater().inflate(R.layout.test3,null));
RelativeLayout.LayoutParams noteLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
noteLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
noteLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
}
noteLayoutParams.addRule(RelativeLayout.BELOW, R.id.StartRelativeLayout);
relativeLayoutMain.addView(noteLayout,noteLayoutParams);
}
我的问题是我不太清楚为什么我的自定义视图组甚至无法在线性布局中呈现textview。它呈现的只是test3布局文件的线性布局。我非常想弄清楚如何才能让textview得到渲染。
请注意,如果我单独使用textView而不将其放入linearlayout,我的自定义视图组会将textview呈现完美。它只发生在我在布局中,然后将它放在我的自定义视图组布局中。
答案 0 :(得分:1)
在屏幕上绘制ViewGroup
需要两个步骤:
衡量 ViewGroup
及其子项以获得正确的尺寸
布局他们应该自画画的孩子
测量是关于找出视图有多大。测量后,您应该有一个值,表明需要的视图大小。
布局实际上是为视图分配位置和大小。您可以但不应忽略测量返回的值。把它变大通常没问题,但是把它缩小很可能会减少一些东西。
没有调用你ViewGroup
的孩子的测量方法,他们不知道他们有多大,或者他们会得到多少空间。
只需将TextView
布局到整个宽度/高度,就可以正确渲染,因为它的大小足以正确渲染。
在没有事先测量的情况下布置LinearLayout
,LinearLayout
本身并不了解其子女。出于布局目的,它正在查看getMeasuredHeight()
,但在那里找不到任何值,因此无法布局其子项。这就是为什么LinearLayout
将'画''而不是它的孩子。
始终包含测量,或从您要扩展的现有布局扩展,例如FrameLayout
如果您只是想自己设置位置,但孩子可能会重叠。如果不进行测量,有些东西会正常工作,有些则不会,而这大多只是试图找出将要发生的事情。