2011-02-04 3 views
6

可視状態がGONEのビューが(望ましくないほど)画面上のスペースを占有しているという問題が発生しています。この問題はなく、ごく最近のデバイス(私はShow a progress bar when an Activity is loadingごとに、いくつかのフィールドを移入しAsyncTasksを利用した後に)可視状態で表示する画面上でスペースを空にしました

コンテキストのビット8+に、APIレベル< = 7デバイス上で常に発生します。 私はの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

[OK]をクリックします。私はそれがあなたの状況に何かを描く方法を全く理解していません。しかし、私はあなたのチェックの後に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

0

私はあなたの人生を不必要に難しくしていると思う。ビューの拡張可能な部分(少数のTextViewsまたはTableLayoutsを持つ非タイトルビット)を1つのコンテナビューに所属させる - FrameLayoutが有望な選択肢と思われ、ちょうどsetVisibility()を呼び出します。

ルーピングの必要はありません。あなたは確実にonLayout()からやりたくはありません...タイトルのonClick()からやり直してください。

+0

それは一方的な方法です。実際には、コンテンツは1つのビュー(つまり、XMLレイアウトファイル内に1つの子ビューのみ)であることを強制する方法はありますか? – Adam

1

onLayout()からonMeasure()にコードを移動することで問題は解決します。

関連する問題