Как зарезервировать пространство для объекта и сделать его невидимым в XML

Ответ

В XML можно зарезервировать пространство с помощью атрибута android:visibility="invisible" (объект остаётся в layout, но невидим) или android:visibility="gone" (объект полностью удаляется из layout, не занимая места).

Для резервирования места используйте View с фиксированными размерами:

<View
    android:id="@+id/placeholder"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:visibility="invisible" />

Также можно динамически управлять видимостью в коде:

val placeholder = findViewById<View>(R.id.placeholder)
placeholder.visibility = View.INVISIBLE // или View.GONE

Разница:

  • INVISIBLE – элемент невидим, но сохраняет своё место.
  • GONE – элемент исчезает, и его место освобождается.

Ответ 18+ 🔞

А, ну это ж классика, ёпта! Слушай, с этим XML-верстанием вечная путаница, прямо манда с ушами какая-то. Люди постоянно путают, когда элемент просто спрятать, а когда его нахуй вообще убрать, чтобы место освободилось.

Вот смотри, есть два варианта, и разница — овердохуища!

Первый — android:visibility="invisible". Это как взять стул, накрыть его покрывалом и сказать: «Стула нет!». Но все вокруг него ходить будут, потому что место-то занято, блядь. Объект в разметке остаётся, рисуется, но его просто не видно. Место он своё держит, как собака кость.

Второй — android:visibility="gone". А это уже взял этот стул и вынес нахуй в коридор. Вообще. Место пустое, другие виджеты могут на это место подвинуться, как в маршрутке, когда один мужик выходит. Элемент из лейаута полностью удаляется, пока ты его обратно не вернёшь.

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

<View
    android:id="@+id/placeholder"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:visibility="invisible" />

Положил этот невидимый кирпич 100x50 dp — и всё, это место твоё, никто туда не влезет. Красота.

А если тебе надо этим в коде управлять (а оно всегда надо), то вообще просто:

val placeholder = findViewById<View>(R.id.placeholder)
placeholder.visibility = View.INVISIBLE // Спрятали, но место держим
// или
placeholder.visibility = View.GONE // Убрали к хуям собачьим, место свободно

Главное — не перепутай, а то получится хитрая жопа: хочешь, чтобы кнопка снизу поднялась, когда заголовок исчез, а ты ему INVISIBLE поставил, и она нихуя не двигается. Волнение ебать, а потом понимаешь, что сам идиот. Запомни: GONE — это «убрать и освободить место», INVISIBLE — это «спрятать, но место моё, не трожь». Всё, вопрос закрыт.