2011-02-04 66 views
6

我遇到一個問題,其中可見狀態爲GONE的視圖在屏幕上佔用空間(不合需要)。上API級總是發生此問題< = 7級的設備,但直到最近纔在8+設備(後我利用AsyncTasks填充某些字段,每Show a progress bar when an Activity is loading如)查看能見度狀態GONE佔用屏幕上的空間

上下文的位: 我創建延伸的LinearLayout定製視圖它包含一個「標題」按鈕和(用戶定義;在某些情況下,它是一些TextViews,在其他人是TableLayouts)「內容」。這個視圖的目的是切換內容onClick標題按鈕的視圖(我不相信有一個內置的小工具這個..我可能是錯的)。

在onLayout()我明確設置的,除了標題GONE所有子視圖的可見性狀態,第一時間是要繪製:

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if(initialDraw) { 
     setContentsVisible(false); 
     initialDraw = false; 
    } 
    super.onLayout(changed, l, t, r, b); 
} 

public void setContentsVisible(boolean visible) { 
    for(int i = 0; i < getChildCount(); i++) { 
     View child = getChildAt(i); 

     if(child != mTitle) { 
      child.setVisibility(visible ? VISIBLE : GONE); 
     } 
    } 
} 

回答

0

確定。我不明白它是如何吸引你的情況的。但我認爲你應該在你檢查後調用super.onLayout()。就像這樣:

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if(initialDraw) { 
     setContentsVisible(false); 
     initialDraw = false; 
    } 
    super.onLayout(l,t,r,b); 
} 

的LinearLayout決定如何佈局其子(垂直,水平)在onLayout(),你沒叫。更重要的是,選擇後,它實際上開始計算如何佈置每個孩子,如果孩子的可見度爲GONE,則跳過它(意味着孩子不會佔用任何空間)。 我認爲對你而言,根本沒有孩子會被擺放出來,但我可能在某個地方是錯的。

+0

哎呦。這是一個複製粘貼錯誤,我確實在調用super.onLayout()。 – Adam 2011-02-04 15:57:50

0

我懷疑你讓你的生活變得不必要的困難。使視圖的可擴展部分(帶有少量TextView或TableLayouts的非標題位)屬於一個容器視圖 - FrameLayout似乎是一種可能的選擇 - 並且只需致電setVisibility()即可。

不需要循環,你絕對不想從onLayout()中做到這一點...只是從你的標題的onClick()做到這一點。

+0

這是一種方法。它會更清潔一點,實際上......有什麼辦法來強制內容只有一個視圖(即只有一個子視圖在XML佈局文件中)? – Adam 2011-02-04 16:27:13

1

將代碼從onLayout()移動到onMeasure()可解決此問題。