2011-02-04 16 views
6

Görünürlük durumu GONE olan görüntülerin (istenmeyen şekilde) ekranda yer kapladığı bir sorun yaşıyorum. I LinearLayout uzanan özel bir görünüm oluşturulan : bu sorunGörünürlük durumu ile görünüm GONE ekranda alan kaplıyor

bağlam A bit (I Show a progress bar when an Activity is loading göre, bazı alanları doldurmak için AsyncTasks kullanılan sonra) API seviyesi her zaman sadece son 8 + cihazlarda < = 7 cihazları, fakat meydana Bir "başlık" düğmesi ve (kullanıcı tanımlı; bazı durumlarda, birkaç TextViews, diğerlerinde bu TableLayouts vardır) "içeriği" içerir. Bu görüntünün amacı, başlık düğmesinin tıklanmasının içeriğini değiştirmektir (Bunun için yerleşik bir widget olduğuna inanmıyorum. Yanlış olabilirim).

açıkça GİTTİ için başlık hariç tüm alt görünümler görünürlük durumunu ayarlamak() onLayout yılında

, öyle ilk kez çekilecek:

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

cevap

0

Ok. Durumunda hiç bir şey çekemediğini anlamıyorum. Ama bence kontrolünden sonra super.onLayout() 'i aramalısın. Şunun gibi:

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 sen aramadın onLayout(), içinde (yatay, dikey veya) çocukları var düzeni nasıl karar verir. Dahası, seçtikten sonra, aslında her çocuğun nasıl düzenleneceğini hesaplamaya başlar ve çocuğun görünürlüğü GONE ise, atlar (çocuk herhangi bir yer almayacaktır). Ben sizin durumunuzda, hiç bir çocuğun dışarıda bırakılmadığını ve gösterilmeyeceğini düşünüyorum, ama bir yerlerde yanılmış olabilirim.

+0

Whoops. Bu bir kopyala-yapıştır hatasıydı, aslında, super.onLayout() öğesini çağırıyorum. – Adam

0

Hayatınızı gereksiz yere zorlaştırdığınızdan şüpheleniyorum. Görünümünüzün genişletilebilir kısmını (birkaç TextViews veya TableLayouts ile başlık olmayan bit) tek bir konteynere ait yapın View - a FrameLayout olası bir seçenek gibi görünüyor - ve bununla ilgili olarak sadece setVisibility()'u arayın.

Döngü gerektirmez ve kesinlikle onLayout() 'dan yapmak istemezsiniz ... bunu yalnızca başlığınızın onClick()'dan yapın.

+0

Tek yön budur. Aslında biraz daha temiz olurdu, aslında içeriğin sadece bir görünüm olduğunu (yani XML düzen dosyasında sadece bir çocuk görünümü) zorlamak için herhangi bir yol var mı? – Adam

1

Kodu onLayout() 'dan onMeasure()' ye taşımak problemi çözer.

İlgili konular