2012-06-15 68 views
4

我有了這個GUI:如何從onLayout重新加載界面?

的LinearLayout

-TableLayout heading 
-ViewFlipper flipper 
    - TableLayout1 
    - TableLayout2 
    - TableLayout3 
     ... (dynamicly added) 

我改變T1的vf.onLayout寬度(..),但我不能重繪....請幫助:/ 以下是代碼:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, 
int bottom) { 
super.onLayout(changed, left, top, right, bottom); 

Log.i(TAG, "flipper onLayout"); 

int idx = this.getDisplayedChild(); 
Log.i(TAG, "flipper displayed child is: " + idx); 
this.heading.cols_widths = some_cols_widths; 
this.heading.resize_cols(); 
LinearLayout lay = (LinearLayout) this.heading.getParent(); 
lay.requestLayout();  
} 

這驅使我瘋了:/

+0

不是一個好主意,改變onLayout的佈局 –

+0

@nininho好吧,那麼佈局第二個視圖後更新第一個視圖的好地方在哪裏? :) – xliiv

+0

當你改變/翻轉到另一個視圖時,它將被佈局並再次繪製,因此不需要更新不可見的視圖。 –

回答

1

所以答案是像尼尼諾上寫道:

「使用postDelayed調用requestLayout。」

2

根據該意見,你想改變你的viewFlipper時ch的「頭」視野開闊。由於您正在調用父項並調用requestLayout,因此只需將超級調用移至最後,這樣就不需要調用requestlayout。

@Override 
protected void onLayout(boolean changed, int left, int top, int right, 
int bottom) { 
    Log.i(TAG, "flipper onLayout"); 

    int idx = this.getDisplayedChild(); 
    Log.i(TAG, "flipper displayed child is: " + idx); 
    this.heading.cols_widths = some_cols_widths; 
    this.heading.resize_cols(); 

    super.onLayout(changed, left, top, right, bottom); 
} 

或者你可以讓resize_cols()調用requestLayout本身。

+0

抱歉讓人困惑,但是..'this.heading'在ViewFlipper之外。它的TableLayout取決於ViewFlipper中的table(currentrly顯示)。 我目前正試圖通過 getChildDrawingOrder改變繪製順序(INT childCount,int i)以 ,但沒有效果。 – xliiv

+0

從你的圖表來看,ViewFlipper和TableLayout是在同一層次上,所以他們的父母是相同的,超級可以工作,但是這是一個線性佈局,所以當ViewFlipper在佈局時調用requestLayout時,Table已經佈局了。因此,如果您事先已知道列寬,請在更改VIewFlipper之前調用resize_cols()或使用postDelayed調用requestLayout。 –

+0

因此,問題在於標題佈局依賴於後來生成的ViewFlipper腳蹼的佈局。解決方法是使用postDeyaled(更具體的我只用Post)在flipper.onLayout中使用heading.requestLayout()。 作品完美.. nininho是一個神:) – xliiv