Неплохо ли использовать отрицательные поля в Android?

Демо отрицательного поля:

                          введите описание изображения здесь

Сценарий

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

Мысли

Кажется, он работает так, как вы ожидаете, с перекрытием макетов, если это необходимо. Но я не хочу сталкиваться с более серьезной проблемой, потому что не знаю, что делать. Эмуляторы, физические устройства, вы называете это, когда вы используете отрицательные поля, все, кажется, работает правильно, один вид вторгается в другой ограничивающий прямоугольник представлений и в зависимости от того, как он объявлен в макете, он будет выше или ниже другого представления.

Я также знаю, что с API 21 мы можем установить translationZ и elevation, чтобы сделать представление выше или ниже других видов, но моя проблема в основном исходит из того, что в документации для атрибутов layout_margin четко указано, что значения маржи должны быть положительными, позвольте мне сказать:

Выдержки:
Задает дополнительное пространство на левой, верхней, правой и нижней сторонах этого представления. Это пространство находится за пределами этой точки зрения. Значения маржи должны быть положительными. Должно быть значение измерения, которое является числом с плавающей запятой, добавленным с помощью блока, такого как" 14.5sp". Доступными единицами являются: px (пиксели), dp (не зависящие от плотности пиксели), sp (масштабированные пиксели на основе предпочтительного размера шрифта), в дюймах, мм (миллиметры)...

В те годы, когда я задавал этот вопрос, у меня не было никаких проблем с отрицательной маржой, старался избегать их использования как можно больше, но не сталкивался с какими-либо проблемами, поэтому даже если в документации указано, что я не слишком беспокоюсь об этом.

Ответ 1

В 2010 году @RomainGuy (разработчик ядра Android) заявил, что отрицательные поля имеют неуказанное поведение.

В 2011 году @RomainGuy заявила, что вы можете использовать отрицательные поля на LinearLayout и RelativeLayout.

В 2014 году @RomainGuy заявила, что они никогда официально не поддерживались и не поддерживались ConstraintLayout.

Легко обойти это ограничение.

Добавьте вспомогательный вид (высота 0dp, ширина, ограниченная родительским) в нижней части базового представления, внизу добавьте требуемое значение.
Затем расположите свой вид ниже этого, фактически позволяя ему иметь "отрицательный" запас, но без использования какого-либо неподдерживаемого отрицательного значения.

Ответ 2

Если вы хотите использовать отрицательный запас, установите достаточное дополнение для контейнера и его clipToPadding на false и установите для него отрицательные поля, чтобы он не обрезал дочерний вид!

Ответ 3

Для меня и для установки отрицательного поля в TextView (я понимаю, что OP относится к ViewGroup, но я искал проблемы с установкой отрицательных полей, и я приземлился здесь)... Я нашел проблему с 4.0.3 (API 15) ТОЛЬКО и настройка android:layout_marginTop или android:layout_marginBottom на отрицательное значение, такое как -2dp.

По какой-то причине TextView вообще не отображается. Похоже, что он "ушел" из представления (не просто невидимый).

Когда я пробовал это с другими 3 версиями layout_margin, я не видел проблемы.

Обратите внимание, что я не пробовал это на реальном устройстве, это использует эмулятор 4.0.3. Это вторая странная вещь, которую я обнаружил, что затронул только 4.0.3, поэтому мое новое правило заключается в тестировании always с эмулятором 4.0.3:)

У меня есть успех с уменьшением нижнего поля TextView с помощью android:lineSpacingExtra="-2dp", который работает, даже если у меня есть android:singleLine="true" (и поэтому я бы не подумал, что межстрочный интервал будет фактором).

Ответ 4

Возможно, это была плохая практика в прошлом, но с Material Design и ее кнопками с плавающим действием, она кажется неизбежной и во многих случаях необходима сейчас. В принципе, когда у вас есть два отдельных макета, которые вы не можете поместить в один RelativeLayout, потому что им нужна определенная раздельная обработка (например, заголовок заголовка и содержимое), единственный способ перекрытия FAB - заставить его торчать из одного макеты с использованием отрицательных полей. И это создает дополнительные проблемы с интерактивными областями.

Ответ 5

Я только знал, что это возможно за довольно короткий промежуток времени. Но я не вижу проблем с этим. Просто помните о размерах экрана и т.д., Чтобы вы не случайно попали на предметы, которые не должны отображаться на экране. (т.е. текст поверх текста, вероятно, представляет собой плохую идею.)