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

ответ

0

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

Смежные вопросы