Проблема с RelativeLayout, когда View view - View.GONE

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

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

Ответ 1

Вы можете разместить текст 2 и 3 в LinearLayout и сохранить линейный макет ниже textview 1.

Ответ 2

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

android:layout_alignWithParentIfMissing="true"

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

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

Ответ 3

Почему бы не обновить атрибут 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);

Ответ 4

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

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

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

Ответ 5

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

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

params.height = 0;

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

view.setLayoutParams(params);

Ответ 6

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

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

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

Ответ 7

Если вы не используете RelativeLayout: используйте LinearLayout.

Ответ 8

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

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

Ответ 9

Установите гравитацию для вашего родительского макета

Ответ 10

Для этого нужно просто поиграть с альфа 0/1. а также отключить onClickListener, если есть