Mam RelativeLayout
więc:
<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>
Każdy TextView
jest zakotwiczony poniżej poprzedniego za TextView
pomocą android:layout_below
.
Problem polega na tym, że TextView2 może tam być lub nie (albo View.VISIBLE
albo View.GONE
); jeśli tak View.VISIBLE
, to wszystko jest w porządku, ale jeśli tak View.GONE
, to TextView3 kończy się renderowaniem na wierzchu TextView1.
Wypróbowałem różne sposoby, aby to naprawić, ale za każdym razem łapie mnie RelativeLayout
zasada „nie można odwołać się do identyfikatora przed jego zdefiniowaniem”.
Mam nadzieję, że brakuje mi tu czegoś oczywistego.
RelativeLayout
ma wbudowany mechanizm wyszukiwania najbliższego widoku zakotwiczenia, który nie został usunięty. Sprawdziłem na Gingerbread i jest tam obecny: github.com/aosp-mirror/platform_frameworks_base/blob/…Odpowiedzi:
Możesz umieścić textview 2 i 3 w LinearLayout i zachować układ liniowy poniżej textview 1.
źródło
Możesz użyć tego tagu:
android:layout_alignWithParentIfMissing="true"
Z dokumentów:
źródło
dlaczego nie zaktualizować
below
atrybutu TextView3 podczas aktualizacji widoczności TextView2? (Zakładam, że robisz to w kodzie)coś jak
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);
źródło
Ta odpowiedź nie rozwiązuje konkretnego problemu, ale rozwiązuje podobny, więc miejmy nadzieję, że to komuś pomoże.
Miałem sytuację, w której mój względny układ nie miał odpowiednika Twojego TextView1. Tak więc w mojej sytuacji, jeśli TextView2 zniknął, chciałem, aby TextView3 był wyrównany z górą elementu nadrzędnego. Rozwiązałem to dodając do TextView3 atrybut android: layout_alignWithParentIfMissing = "true". Zobacz http://developer.android.com/resources/articles/layout-tricks-efficiency.html .
Niestety nie widzę sposobu na określenie alternatywnej kotwicy wyrównania, chyba że jest to element nadrzędny.
źródło
Zapomnij o
INVISIBLE
lubGONE
, użyj tego zamiast tego:RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); params.height = 0; params.setMargins(0,0,0,0); view.setLayoutParams(params);
źródło
możesz to zrobić
<RelativeLayout> <TextView1/> <FrameLayout> <TextView2/> // <-- View.VISIBLE OR View.GONE </FrameLayout> <TextView3/> <TextView4/> </RelativeLayout>
niech TextView3 poniżej tego FrameLayout, który nie ma tła, więc jeśli TextView2 zniknął, nie zajmuje miejsca.
źródło
umieść wszystkie textViews w LinearLayout z orientacją pionową.
<LinearLayout> <TextView/> <TextView/> <TextView/> <TextView/> <TextView/> <TextView/> </LinearLayout>
źródło
Prostym sposobem na to jest granie z alfa 0/1. a także wyłącz onClickListener, jeśli taki istnieje
źródło