Проблема с RelativeLayout, когда видимость представления является представлением.УШЕДШИЙ


у меня есть 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 65

8 ответов:

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

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

android:layout_alignWithParentIfMissing="true"

документы:

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

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

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

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

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

забудь о INVISIBLE или GONE, используйте этот код:

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

params.height = 0;

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

view.setLayoutParams(params);

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

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

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

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

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

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