Установка размера кнопки в соответствии с размером динамического настраиваемого представления - PullRequest
0 голосов
/ 22 сентября 2011
  1. CalendarBackground - это пользовательское представление, которое реализует onDraw () и onMeasure ().Его размер является динамическим, рассчитывается в onMeasure ().

  2. 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>  
    
  3. Позиция и размер кнопки 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 раза, хотя я хочу получить результат выполнения.

1 Ответ

0 голосов
/ 22 сентября 2011

Существует размерная взаимозависимость.Поэтому в зависимости от устройства размер представления будет меняться.Вы должны изменить файл манифеста Android для этого.Загляните на сайт developers.android ...

...