CalendarBackground - это пользовательское представление, которое реализует onDraw () и onMeasure ().Его размер является динамическим, рассчитывается в onMeasure ().
CalendarView - это еще одно настраиваемое представление, которое расширяет следующий RelativeLayout.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<lc.test.CalendarBackground
android:id="@+id/calBg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/prevMonth"
android:text="@string/prev_month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
Позиция и размер кнопки prevMonth должны определяться CalendarBackground, поэтому мне нужно изменить ее размер после вызова CalendarBackground.onMeasure ().
Я знаю, как изменить размер кнопки, установив ее LayoutParams прагматично, но я не знаю, куда мне поместить эти коды?Это не может быть в конструкторе CalendarView, потому что код там вызывается до CalendarBackground.onMeasure () ...
Большое спасибо!
Поскольку я не могу ответить на свой вопрос, япоставьте ответ здесь:
Я понял.Переопределите метод onLayout класса CalendarView и установите размер кнопки там.
Это код CalendarBackground.onMaesure:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//Get canvas width and height
wCalendar = MeasureSpec.getSize(widthMeasureSpec);
hCalendar = 7*MeasureSpec.getSize(heightMeasureSpec)/10;
setMeasuredDimension(wCalendar, hCalendar);
}
Это код CalendarView.onLayout:
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(prevMonth.getLayoutParams());
lp.width = (right - left)/7;
lp.height = (bottom - top)/7;
prevMonth.setLayoutParams(lp);
}
Результат именно то, что я хочу.Этот onLayout вызывается после CalendarBackground.onMeasure ().
Однако я заметил еще один вопрос.Это последовательность выполнения:
4 раза CanlendarBackground.onMaesure (), затем CalendarView.onLayout (), затем еще 4 раза CanlendarBackground.onMaesure (), затем еще один CalendarView.onLayout (), затем CanlendarBackground.onDraw ().
Что-то не так с моим кодом?Я имею в виду, что эта последовательность не имеет смысла.CanlendarBackground.onMaesure () вызывается 8 раз, а CalendarView.onLayout () вызывается 2 раза, хотя я хочу получить результат выполнения.