Görünüm görünürlüğü View.GONE olduğunda RelativeLayout ile ilgili sorun


82

Ben ettik RelativeLayoutböylece:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

Her TextViewönceki altında demirlemiş TextViewolan android:layout_below.

Sorun şu ki, TextView2 orada olabilir veya olmayabilir (ya ya View.VISIBLEda View.GONE); eğer öyleyse View.VISIBLE, o zaman her şey yolundadır, ancak öyleyse View.GONE, TextView3, TextView1'in üstünde işlenir.

Bunu düzeltmek için çeşitli yollar denedim, ancak RelativeLayout's' tarafından her yakalandığında, tanımlanmadan önce bir kimliğe başvuramazsınız 'kuralı.

Burada bariz bir şeyi kaçırdığımı umuyorum.


RelativeLayoutGONE olmayan en yakın bağlantı görünümünü bulmak için gömülü bir mekanizmaya sahiptir. Gingerbread'e baktım ve orada bile mevcut: github.com/aosp-mirror/platform_frameworks_base/blob/…
Miha_x64

Yanıtlar:


44

Metin görünümü 2 ve 3'ü LinearLayout'a yerleştirebilir ve lineer düzeni metin görünümü 1'in altında tutabilirsiniz.


14
Bir düzen dosyasına hiyerarşi eklemek, özellikle de RelativeLayout ise her zaman kötü bir fikirdir. Ne kadar çok eklerseniz, Android düzeninizi temsil edecek Nesneler oluşturacaktır. Bunun yerine android: layout_alignWithParentIfMissing = "true" gibi bir şey kullanmalısınız. Örneğin TableLayout gibi diğer düzenleri kullanmayı da düşünebilirsiniz.
Francois Dermu 02

203

Bu etiketi kullanabilirsiniz:

android:layout_alignWithParentIfMissing="true"

Dokümanlardan:

True olarak ayarlanırsa, layout_toLeftOf, layout_toRightOf, vb. İçin bağlantı bulunamadığında üst öğe bağlantı olarak kullanılır.


24
Bu sadece ebeveyn ile uyum istendiğinde işe yarar, ancak soru üst ile değil, önceki görünümle nasıl hizalanacağıyla ilgiliydi.
dimsuz

@dismuz, bu dinamik düzenlerin yönetilmesinde çok faydalı olacak ve öngörülemeyen köşe durumlarda herhangi bir sürprizden kaçınacaktır.
ininprsr

11

belowTextView2'nin görünürlüğünü güncellediğinizde neden TextView3 özniteliğini güncellemiyorsunuz? (Bunu kodla yaptığınızı varsayıyorum)

gibi bir şey

TextView tv = (TextView) findViewById(R.id.textview3);
RelativeLayout.LayoutParams lp =
    (RelativeLayout.LayoutParams) tv.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.textview1);
((TextView) view).setLayoutParams(lp);

8

Bu cevap sizin özel probleminizi çözmez, ancak benzerini çözer, bu yüzden umarım bu birilerine yardımcı olur.

Göreceli düzenimin TextView1'inizin eşdeğerine sahip olmadığı bir durum yaşadım. Yani, benim durumumda, TextView2 GONE ise, TextView3'ün ebeveynin üst kısmı ile hizalanmasını istedim. Bunu TextView3'e android: layout_alignWithParentIfMissing = "true" özelliğini ekleyerek çözdüm. Http://developer.android.com/resources/articles/layout-tricks-efficiency.html adresine bakın .

Ne yazık ki, üst öğe olmadığı sürece alternatif bir hizalama tutturucusu belirtmenin bir yolunu görmüyorum.


7

Unutun INVISIBLEveya GONEbunun yerine şunu kullanın:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();

params.height = 0;

params.setMargins(0,0,0,0);

view.setLayoutParams(params);

4

Bunu yapabilirsiniz

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>

Arka planı olmayan bu FrameLayout'un altında TextView3'ü bırakın, böylece TextView2 Gone ise, yer kaplamaz.


1

tüm textView'ları dikey yönlendirmeyle LinearLayout altına yerleştirin.

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>

-3

Bunun için basit bir hack, alpha 0/1 ile oynamaktır. ve varsa onClickListener'ı devre dışı bırakın


Bu, gereksiz alanı kaplayacaktır.
Henrique Monte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.