0

次のように onLayout メソッドをオーバーライドするカスタム コンポーネントがあります。

@Override
    public void onLayout(boolean changed, int left, int top, int right, int bottom) {
        int[] location = new int[2];
        this.getLocationOnScreen(location);
        int x = location[0];
        int y = location[1];
        int w = this.getWidth();
        int h = y+(8*CELL_HEIGHT);

        updateMonthName();
        initCells();

        CELL_MARGIN_LEFT = 0;
        CELL_MARGIN_TOP = monthNameBounds.height();
        CELL_WIDTH = w / 7;

        setFrame(x, y, x+w, h);
        super.onLayout(true, x, y, w, h);
    }

ただし、次のように線形レイアウトでこのコンポーネントを使用する場合:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="10dp"
    android:orientation="vertical">

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView above"
        android:textSize="15sp"
        />

    <com.project.calenderview.CalendarView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView below"
        android:textSize="15sp"
        />

</LinearLayout>

レイアウトは、テキストビュー「上のTextView」が最初、「下のTextView」が2番目、次に両方の中間にあると予想されるコンポーネントになるようにレンダリングされます。

編集:これもonDrawです:

@Override
    protected void onDraw(Canvas canvas) {
        // draw background
        super.onDraw(canvas);

        //Draw month name
        canvas.drawText(monthName, (this.getWidth() / 2) - (monthNameBounds.width() / 2), monthNameBounds.height() + 10, monthNamePaint);

        //Draw arrows
        monthLeft.draw(canvas);
        monthRight.draw(canvas);

        // draw cells
        for(Cell[] week : mCells) {
            for(Cell day : week) {
                if(day == null) continue;
                day.draw(canvas);   
            }
        }

    }

ここで間違っているのは何ですか?

ありがとう

4

1 に答える 1

0

onLayout メソッドはint left, int top, int right, int bottom、ビューが描画される場所を示していますが、明らかにそれを完全に無視しています。これらの値を使用して、適切にレイアウトする必要があります。

編集:

ViewGroup を拡張していない場合は、オーバーライドしないでくださいonLayout(bool, int, int, int, int)

ドキュメントView.onLayoutから:

このビューがその子のそれぞれにサイズと位置を割り当てる必要があるときに、レイアウトから呼び出されます。子を持つ派生クラスは、このメソッドをオーバーライドし、それぞれの子でレイアウトを呼び出す必要があります。

子を持つ派生クラスは、このメソッドをオーバーライドし、それぞれの子でレイアウトを呼び出す必要があります

最終結果で発生している問題は、コードの他の部分にあります。

于 2013-01-11T12:02:25.067 に答える