Проблема с RelativeLayout, когда видимость View равна View.GONE - PullRequest
72 голосов
/ 19 июля 2010

У меня есть 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' вы не можете ссылаться на идентификатор до того, как он будет определен 'правилом.

Я надеюсь, что здесь упущено что-то очевидное.

Ответы [ 8 ]

177 голосов
/ 15 февраля 2012

Вы можете использовать этот тег:

android:layout_alignWithParentIfMissing="true"

Из документов:

Если задано значение true, родительский элемент будет использоваться в качестве привязки, когда невозможно найти привязку для layout_toLeftOf, layout_toRightOf и т. Д.

40 голосов
/ 19 июля 2010

Вы можете поместить текстовые представления 2 и 3 в LinearLayout и сохранить линейный макет ниже текстового просмотра 1.

10 голосов
/ 19 июля 2010

почему бы не обновить атрибут 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);
6 голосов
/ 02 сентября 2011

Забудьте о INVISIBLE или GONE, используйте вместо этого:

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

params.height = 0;

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

view.setLayoutParams(params);
6 голосов
/ 15 июля 2011

Этот ответ не решает вашу конкретную проблему, но решает аналогичную, поэтому, надеюсь, это кому-нибудь поможет.

У меня была ситуация, когда моя относительная компоновка не имела эквивалента вашего TextView1. Итак, в моей ситуации, если TextView2 был GONE, то я хотел, чтобы TextView3 был выровнен по верху родителя. Я решил это, добавив в TextView3 атрибут android: layout_alignWithParentIfMissing = "true". Смотри http://developer.android.com/resources/articles/layout-tricks-efficiency.html.

К сожалению, я не вижу способа указать альтернативную привязку выравнивания, если она не является родительской.

2 голосов
/ 07 сентября 2018

вы можете сделать это

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

пусть TextView3 ниже этого FrameLayout, у которого нет фона, поэтому, если TextView2 пропал, он не занимает места.

0 голосов
/ 13 сентября 2018

Поместить все текстовые представления в LinearLayout с вертикальной ориентацией.

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>
0 голосов
/ 03 июня 2018

Простой взлом для этого - поиграть с альфа 0/1. а также отключите onClickListener, если есть какой-либо

...