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 раза, хотя результат выполнения - это то, что я хочу.