Android에서 마이너스 마진을 사용하는 것이 나쁜 습관입니까?


114

마이너스 마진 데모 :

                         여기에 이미지 설명 입력

시나리오

다른 뷰의 경계 상자를 침범하도록 뷰 중 하나에 음수 여백을 설정하여 뷰를 겹칩니다.

생각

레이아웃이 겹치는 경우 예상대로 작동하는 것 같습니다. 그러나 나는 무의식적으로 일을 제대로하지 않는 것에 대해 더 큰 문제에 부딪 히고 싶지 않습니다. 에뮬레이터, 물리적 장치, 이름을 지정하면 음의 여백을 사용할 때 모든 것이 올바르게 작동하는 것처럼 보이며 하나의 뷰가 다른 뷰 경계 상자를 침범하고 레이아웃에서 선언 된 방식에 따라 다른 뷰의 위 또는 아래에 있습니다.

나는 또한 API (21) 이후 우리가를 설정할 수 있습니다 알고 있어요 translationZelevation 보기 위 또는 다른 뷰 아래에 표시 할 속성을하지만 내 관심사는 기본적으로는 사실에서 오는 문서에 에 대한 layout_margin특성이 명확하게 지정된 것 여백 값이 양수이어야한다 ,하자 나 인용 :

발췌 :
이보기의 왼쪽, 위쪽, 오른쪽 및 아래쪽에 추가 공간을 지정합니다. 이 공간은이 뷰의 범위 밖에 있습니다. 여백 값은 양수 여야합니다 . "14.5sp"와 같은 단위가 추가 된 부동 소수점 숫자 인 차원 값이어야합니다. 사용 가능한 단위 : px (픽셀), dp (밀도 독립 픽셀), sp (기본 글꼴 크기에 따라 조정 된 픽셀), in (인치), mm (밀리미터) ...

원래이 질문을 한 후 몇 년 동안 나는 마이너스 마진에 대한 문제가 없었고 가능한 한 많이 사용하지 않으려 고 노력했지만 문제가 발생 하지 않았 으므로 문서에 나와 있지만 나도 그렇지 않습니다. 그것에 대해 걱정했습니다.


1
나는 에스프레소 테스트가 마진 중 하나가 음수이면 개체를 볼 수 없다는 것을 알고 있습니다. 그래서 사용하지 않는 이유입니다.
Tim Boland

답변:


192

2010 년 @RomainGuy (핵심 Android 엔지니어)는 마이너스 마진이 지정되지 않은 동작을 가졌다 고 말했습니다 .

2011 년 @RomainGuy는 및에서 마이너스 마진을 사용할 수LinearLayoutRelativeLayout 있다고 말했습니다 .

2016 년 @RomainGuy는 공식적으로 지원 한 적이 없으며ConstraintLayout .

하지만이 제한을 해결하는 것은 쉽습니다.

기본보기 하단에 도우미보기 (높이 0dp, 부모에 제한되는 너비)를 추가하고 하단에 원하는 여백을 추가합니다.
그런 다음 뷰를이 뷰 아래에 배치하여 지원되지 않는 음수 값을 사용할 필요없이 "음수"여백을 효과적으로 허용합니다.


1
누군가 다른 통찰력이있을 경우를 대비해 열어두면 무해한 것으로 보입니다
Juan Cortés

1
@DrewLeSueur : 나는 그 가정을하지 않을 것입니다. 네거티브 패딩이 무엇을 의미하는지 전혀 모릅니다.
CommonsWare

1
@CommonsWare는 "-@ dimen / anyvalue"와 같은 일을 할 수 있다고 말할 수 있습니까? 선언 된 값을 원하지만 부정적입니다. 도움말
deadfish

2
@ 100kg : 죄송합니다. 지원되지 않습니다.
CommonsWare

21
Android 4.4 KitKat에서 마이너스 마진과 관련하여 무언가 변경 되었음을 발견했습니다 (4.3과 비교하여 적어도 Asus Nexus 7에서는). 당신이 필요로 android:clipChildren="false"하고 android:clipToPadding="false"이전에하지 않았던 곳 이 밝혀 졌거나 이런 일이 발생했습니다 .
Jonik

18

이것이 누군가를 도울 수 있기를 바랍니다. 다음은 ConstraintLayout@CommonsWare의 답변 을 기반으로 사용하는 샘플 코드입니다 .

기본보기 하단에 도우미보기 (높이 0dp, 부모에 제한되는 너비)를 추가하고 하단에 원하는 여백을 추가합니다. 그런 다음 뷰를이 뷰 아래에 배치하여 지원되지 않는 음수 값을 사용할 필요없이 "음수"여백을 효과적으로 허용합니다.

샘플 코드 :

<TextView
    android:id="@+id/below"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F1B36D"
    android:padding="30dp"
    android:text="I'm below"
    android:textColor="#ffffff"
    android:textSize="48sp"
    android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<android.support.v4.widget.Space
    android:id="@+id/space"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    android:id="@+id/top"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:textAlignment="center"
    android:textColor="#ffffff"
    android:text="I'M ON TOP!"
    android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

산출:

여기에 이미지 설명 입력


16

음수 여백을 사용하려면 컨테이너와 clipToPadding 에 충분한 패딩을 설정하고 하위 여백을 음수 여백으로 설정하여 하위 뷰를 자르지 않도록하십시오!


4

과거에는 나쁜 습관 이었지만 머티리얼 디자인과 플로팅 액션 버튼을 사용하면 지금은 많은 경우에 필연적이고 필요한 것 같습니다. 기본적으로 별개의 처리가 필요하기 때문에 단일 RelativeLayout에 넣을 수없는 두 개의 개별 레이아웃이있는 경우 (예 : 헤더 및 내용을 생각해보세요) FAB를 겹치는 유일한 방법은 하나에서 튀어 나오게하는 것입니다. 네거티브 여백을 사용하는 레이아웃. 그리고 이것은 클릭 가능한 영역에 추가적인 문제를 일으 킵니다.


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에만 영향을 미치는 두 번째 이상한 점입니다. 그래서 저의 새로운 규칙은 항상 4.0.3 에뮬레이터로 테스트하는 :)

내가 가지고 android:lineSpacingExtra="-2dp"있더라도 작동 하는 TextView의 하단 여백을 줄이는 데 성공했습니다 android:singleLine="true"(따라서 줄 간격이 요인이 될 것이라고 생각하지 않았을 것입니다).


1
Nexus 4 (xhdpi) 및 4.2.2에서 유사한 동작을 발견했습니다. 패딩이없는 레이아웃이 있었지만 부모 레이아웃에는 패딩이 있습니다. 내부에 marginTop이 음수 인 TextView가 있습니다. 5.0에서는 잘 작동했습니다. 4.2.2에서는 기기와 Nexus 4 용 에뮬레이터 모두에서 사라집니다. 해결책은 패딩을 TextView가 포함 된 레이아웃으로 이동하는 것이 었습니다.
louielouie

3

아니요, negative margin. 대신 translate. 언젠가 음수 여백이 작동하더라도 프로그래밍 방식으로 레이아웃을 변경하면 번역이 도움이 될 것입니다. 그리고 여백을 사용하면 화면이 넘칠 수 없습니다.


0

나는 그것이 짧은 시간 동안 만 가능하다는 것을 알고있었습니다. 그러나 나는 그것에 문제가 없다고 본다. 화면 크기 등에 유의하여 화면에 겹쳐서 표시되지 않아야하는 항목을 실수로 만들지 않도록하십시오. (즉, 텍스트 위에있는 텍스트는 나쁜 생각 일 수 있습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.