Проблема з RelativeLayout, коли видимість перегляду - View.GONE


82

У мене таке RelativeLayout:

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

Кожен з TextViewних закріплений нижче попереднього TextViewз android:layout_below.

Проблема в тому, що TextView2 може там бути, а може і не бути (або View.VISIBLEабо View.GONE); якщо це View.VISIBLE, то все добре, але якщо це так View.GONE, тоді TextView3 в кінцевому підсумку відображається поверх TextView1.

Я пробував різні способи виправити це, але кожного разу, коли мене виявляє RelativeLayout"s", ви не можете посилатися на ідентифікатор, перш ніж він буде визначений ".

Я сподіваюся, що я пропускаю тут щось очевидне.


RelativeLayoutмає вбудований механізм для пошуку найближчого неприйнятого анкерного виду. Я перевірив «Пряник», і він присутній навіть там: github.com/aosp-mirror/platform_frameworks_base/blob/…
Miha_x64

Відповіді:


44

Ви можете розмістити текстовий вигляд 2 і 3 у LinearLayout і зберегти лінійний макет під текстовим видом 1.


14
Додавання ієрархії до файлу макета - це завжди погана ідея, особливо якщо це RelativeLayout. Чим більше ви додасте, тим більше Android буде створювати об’єкти, що відображатимуть ваш макет. Замість цього слід використовувати щось на зразок android: layout_alignWithParentIfMissing = "true". Ви також можете розглянути можливість використання інших макетів, наприклад, TableLayout.
Франсуа Дерму

203

Ви можете використовувати цей тег:

android:layout_alignWithParentIfMissing="true"

З документів:

Якщо встановлено значення true, батьківський буде використовуватися як прив'язка, коли прив'язка не може бути знайдена для layout_toLeftOf, layout_toRightOf тощо.


24
Це працює лише тоді, коли бажане вирівнювання з батьківським, але питання полягало в тому, як вирівняти попередній вигляд, а не батьківський.
dimsuz

@dismuz, це буде дуже корисно в управлінні динамічними макетами та уникає будь-яких сюрпризів у непередбачених кутових випадках.
ininprsr

11

чому б не оновити belowатрибут TextView3 під час оновлення видимості TextView2? (Припускаю, ви робите це в коді)

щось на зразок

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

Ця відповідь не вирішує вашої конкретної проблеми, але вирішує подібну, тому, сподіваємось, це комусь допоможе.

У мене була ситуація, коли в моєму відносному макеті не було еквівалента тексту TextView1. Отже, у моїй ситуації, якщо TextView2 був ВІДХОДЕНИМ, тоді я хотів, щоб TextView3 був вирівняний до верхньої частини батьків. Я вирішив це, додавши до TextView3 атрибут android: layout_alignWithParentIfMissing = "true". Див. Http://developer.android.com/resources/articles/layout-tricks-efficiency.html .

На жаль, я не бачу способу вказати альтернативний якір вирівнювання, якщо він не є батьківським.


7

Забудьте про INVISIBLEабо GONE, скористайтеся цим:

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

params.height = 0;

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

view.setLayoutParams(params);

4

Ви можете це зробити

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

нехай TextView3 нижче цього FrameLayout, який не має фону, тому, якщо TextView2 зник, він не займає місця.


1

розмістіть усі textViews під LinearLayout з вертикальною орієнтацією.

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

-3

Простий хак для цього - грати з альфа 0/1. а також вимкнути onClickListener, якщо такий є


Це збереже зайвий простір.
Монте
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.