根据动态自定义视图的大小设置按钮的大小

时间:2011-09-22 08:20:58

标签: android custom-controls

  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的位置&amp; size应该由CalendarBackground决定,所以我需要在调用CalendarBackground.onMeasure()之后更改它的大小。

  4. 我知道如何通过实用设置LayoutParams来更改按钮的大小,但我不知道我应该在哪里放这些代码?它不能在CalendarView的构造函数中,因为在CalendarBackground.onMeasure()之前调用了代码......

    非常感谢!


    由于我无法回答我自己的问题,我把答案放在这里:

    我明白了。覆盖CalendarView类的onLayout方法,并在那里设置按钮的大小。

    这是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);      
    }
    

    结果正是我想要的。在CalendarBackground.onMeasure()之后调用此onLayout。

    然而,我发现了另一个问题。那是执行顺序:
    4次CanlendarBackground.onMaesure(),然后是CalendarView.onLayout(),然后是另外4次CanlendarBackground.onMaesure(),然后是另一个CalendarView.onLayout(),然后是CanlendarBackground.onDraw()。

    我的代码有什么问题吗?我的意思是这个序列没有意义。 CanlendarBackground.onMaesure()被调用8次,而CalendarView.onLayout()被调用2次,尽管执行结果是我想要的。

1 个答案:

答案 0 :(得分:0)

大小相互依存。因此,视设备而定,视图的大小会发生变化。你必须为此修改android清单文件。看看developers.android ...网站