无法在linearlayout

时间:2018-01-05 15:02:15

标签: android android-layout android-custom-view

我正在研究一个复合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函数的原点坐标在实际的屏幕空间内。我真的很感激这方面的一些帮助。

0 个答案:

没有答案