我正在研究一个复合android组件,试图了解它们的更多信息。结构非常简单,它包含textview作为标题,editText视图和LinearLayout作为列表。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:textSize="20sp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
/>
<LinearLayout
android:id="@+id/ListPoint"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
</merge>
大部分工作正常,因为一切都显示在屏幕上。我可以将任何类型的普通视图添加到内部LinearLayout,它可以很好地工作。问题是,我有一个无法正确显示的自定义列表元素组件。它的唯一目的是显示文本,这是一种简单的方法,可以覆盖onMeasure和onDraw方法。
我可以将这些自定义视图元素添加到内部布局中,并且它们将调用覆盖onMeasure和onDraw方法。但是,只有添加到LinearLayout的第一个元素才会显示在屏幕上。我搜索过,但我找不到发生这种情况的原因。以下是相关代码。
public CustomView(Context context, int oriX, int oriY, Paint textColor, LayoutParams params) {
super(context);
this.params = params;
this.textColor= textColor;
this.context = context;
this.params = params;
elementText = "";
originX = oriX;
originY = oriY;
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
System.out.println("UsedMeasurements: " + getMeasuredWidth() + ", " + getMeasuredHeight());
canvas.drawText(elementText, originX, originY, textColor);
System.out.println(elementText + " drawn with origin: (" + originX + ", " + originY + ").");
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSpec = MeasureSpec.getSize(widthMeasureSpec);
int heightSpec = MeasureSpec.getSize(heightMeasureSpec);
int preferredWidth = params.width;
int preferredHeight = params.height;
int usedWidth;
int usedHeight;
if(widthMode == MeasureSpec.EXACTLY)
usedWidth = widthSpec;
else if(widthMode == MeasureSpec.AT_MOST)
usedWidth = Math.min(preferredWidth, widthSpec);
else
usedWidth = preferredWidth;
if(heightMode == MeasureSpec.EXACTLY)
usedHeight = heightSpec;
else if(heightMode == MeasureSpec.AT_MOST)
usedHeight = Math.min(preferredHeight, heightSpec);
else
usedHeight = preferredHeight;
setMeasuredDimension(usedWidth, usedHeight);
}
onDraw函数中的打印操作只是为了确保它们被调用。他们这样做,所以这不是问题。我还确保drawText函数的原点坐标在实际的屏幕空间内。我真的很感激这方面的一些帮助。