2013-01-11 63 views
0

我具有被重寫onLayout方法的定製組件如下:定製組件佈局順序

@Override 
    public void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     int[] location = new int[2]; 
     this.getLocationOnScreen(location); 
     int x = location[0]; 
     int y = location[1]; 
     int w = this.getWidth(); 
     int h = y+(8*CELL_HEIGHT); 

     updateMonthName(); 
     initCells(); 

     CELL_MARGIN_LEFT = 0; 
     CELL_MARGIN_TOP = monthNameBounds.height(); 
     CELL_WIDTH = w/7; 

     setFrame(x, y, x+w, h); 
     super.onLayout(true, x, y, w, h); 
    } 

然而,在LinearLayout中使用該組件時,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" 
    android:padding="10dp" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="TextView above" 
     android:textSize="15sp" 
     /> 

    <com.project.calenderview.CalendarView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="TextView below" 
     android:textSize="15sp" 
     /> 

</LinearLayout> 

佈局是呈現使得textview上面的「TextView」是第一個,「TextView下面」是第二個,然後是我的組件,它預計在兩者之間的中間。

編輯: 這裏也是的onDraw:

@Override 
    protected void onDraw(Canvas canvas) { 
     // draw background 
     super.onDraw(canvas); 

     //Draw month name 
     canvas.drawText(monthName, (this.getWidth()/2) - (monthNameBounds.width()/2), monthNameBounds.height() + 10, monthNamePaint); 

     //Draw arrows 
     monthLeft.draw(canvas); 
     monthRight.draw(canvas); 

     // draw cells 
     for(Cell[] week : mCells) { 
      for(Cell day : week) { 
       if(day == null) continue; 
       day.draw(canvas); 
      } 
     } 

    } 

它是什麼,我做錯了什麼?

感謝

回答

0

的onLayout方法是通過int left, int top, int right, int bottom顯示在您的視圖應該繪製,但顯然你完全無視它。你可以使用這些值來正確地佈置它。

編輯:

,如果你不延伸的ViewGroup中你不應該重寫onLayout(bool, int, int, int, int)

從文檔 View.onLayout

從佈局時調用這個觀點應該分配大小和位置爲 其每個孩子。帶孩子的衍生課程應覆蓋此方法,並調用其每個孩子的佈局。

派生類兒童應覆蓋此方法,並調用佈局上的每個孩子

你對最終結果有問題是在你的代碼的其他部分的。

+0

top&bottom是完全相同的值= 47,這意味着高度爲零......這就是爲什麼我決定計算自己的價值。有什麼理由呢? – Maverick

+0

是您的自定義組件擴展ViewGroup或只是查看? – Budius

+0

我將ImageView擴展爲更具體的 – Maverick