[android] Android View의 상단과 하단에 테두리를 추가하는 쉬운 방법이 있습니까?

TextView가 있고 위쪽 및 아래쪽 테두리를 따라 검은 색 테두리를 추가하고 싶습니다. 나는 추가 시도 android:drawableTop하고 android:drawableBottom텍스트 뷰에 있지만, 단지 전체보기 검정이 될 일으켰습니다.

<TextView
    android:background="@android:color/green"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:drawableTop="@android:color/black"
    android:drawableBottom="@android:color/black"
    android:text="la la la" />

Android의 View (특히 TextView)에 위쪽 및 아래쪽 테두리를 쉽게 추가하는 방법이 있습니까?



답변

안드로이드 2.2에서는 다음을 수행 할 수 있습니다.

/res/drawable/textlines.xml과 같은 XML 드로어 블을 만들고이를 TextView의 배경 속성으로 할당합니다.

<TextView
android:text="My text with lines above and below"
android:background="@drawable/textlines"
/>

/res/drawable/textlines.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
      <shape
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#FF000000" />
            <solid android:color="#FFDDDDDD" />

        </shape>
   </item>

   <item android:top="1dp" android:bottom="1dp">
      <shape
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="#FFDDDDDD" />
            <solid android:color="#00000000" />
        </shape>
   </item>

</layer-list>

단점은 투명 용지가 작동하지 않으므로 불투명 한 배경색을 지정해야한다는 것입니다. (적어도 나는 그들이 생각했지만 실수했습니다). 위의 예에서 첫 번째 모양 #FFdddddd의 단색이 두 번째 모양의 획 색상으로 복사되어 있음을 알 수 있습니다.


답변

테두리가 컨테이너 외부에 표시되도록 트릭을 사용했습니다. 이 트릭을 사용하면 선만 그려 지므로 배경이 기본보기로 표시됩니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:bottom="1dp"
        android:left="-2dp"
        android:right="-2dp"
        android:top="-2dp">
        <shape android:shape="rectangle" >
            <stroke
                android:width="1dp"
                android:color="#FF000000" />

            <solid android:color="#00FFFFFF" />

            <padding android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

</layer-list>


답변

옵션 1 : 도형 드로어 블

레이아웃 또는보기 주변에 배경을 설정할 수있는 테두리를 원하는 경우 가장 간단한 옵션입니다. drawable폴더에 다음과 같은 XML 파일을 작성하십시오 .

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#8fff93" />

    <stroke
        android:width="1px"
        android:color="#000" />

</shape>

solid채우기를 원하지 않으면를 제거 할 수 있습니다 . 세트background="@drawable/your_shape_drawable"레이아웃 / 뷰 .

옵션 2 : 배경보기

여기에 사용한 약간의 트릭이 있습니다. RelativeLayout 있습니다. 기본적으로 뷰 아래에 테두리를 제공하려는 검은 사각형이 있고 그 뷰에 여백이 아닌 패딩을 제공하여 검은 사각형이 가장자리에 표시되도록합니다.

뷰에 투명한 영역이없는 경우에만 제대로 작동합니다. 그렇다면 BorderView테두리를 그리는 사용자 정의 를 작성하는 것이 좋습니다 . 수십 줄의 코드 일뿐입니다.

<View
    android:id="@+id/border"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/image"
    android:layout_alignLeft="@+id/image"
    android:layout_alignRight="@+id/image"
    android:layout_alignTop="@+id/main_image"
    android:background="#000" />

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_...
    android:padding="1px"
    android:src="@drawable/..." />

당신이 궁금해하는 경우, 그것은 수행 과 일을 adjustViewBounds=true. 당신은 전체의 배경을하려는 경우에는 작동하지 않습니다 RelativeLayout당신이 작성 중지 버그가 있기 때문에, RelativeLayoutA의가 View. 이 경우 Shape드로어 블을 권장합니다 .

옵션 3 : 9 패치

마지막 옵션은 다음과 같이 9 패치 드로어 블을 사용하는 것입니다.

설정할 수있는 모든보기에서 사용할 수 있습니다 android:background="@drawable/...". 그리고 예 6×6이 필요합니다-5×5를 시도했지만 작동하지 않았습니다.

이 방법의 단점은 색상을 매우 쉽게 변경할 수 없지만 멋진 테두리 (예 :이 질문에서와 같이 위쪽 및 아래쪽 테두리 만)를 원하면 Shape드로어 블을 사용 하여 테두리를 만들 수 없을 수도 있습니다 매우 강력하지 않습니다.

옵션 4 : 추가 조회수

뷰 위와 아래에 테두리 만 원하는 경우이 간단한 옵션을 언급하는 것을 잊었습니다. 뷰를 수직으로 배치 LinearLayout한 다음 (아직없는 경우) 다음 View과 같이 위와 아래에 빈 s 를 추가 할 수 있습니다.

<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>


답변

1dp하단에만 흰색 테두리 를 추가하고 투명한 배경을 얻으려면 여기에서 대부분의 답변보다 간단한 다음을 사용할 수 있습니다.

위해 TextView또는 다른 뷰 추가 :

android:background="@drawable/borderbottom"

그리고 drawable디렉토리에 다음 XML을 추가하십시오.borderbottom.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="-2dp" android:left="-2dp" android:right="-2dp">
        <shape android:shape="rectangle">
            <stroke android:width="1dp" android:color="#ffffffff" />
            <solid android:color="#00000000" />
        </shape>
    </item>
</layer-list>

당신은 상단에 테두리를 원하는 경우, 변경 android:top="-2dp"android:bottom="-2dp"

색상이 흰색 일 필요는 없으며 배경도 투명하지 않아도됩니다.

solid요소는 필요하지 않을 수 있습니다. 이것은 디자인에 달려 있습니다 (V. Kalyuzhnyu 덕분에).

기본적으로이 XML은 사각형 모양을 사용하여 테두리를 만든 다음 모양의 렌더링 영역 위로 위쪽, 오른쪽 및 왼쪽을 밀어냅니다. 아래쪽 테두리 만 보입니다.


답변

현재 승인 된 답변이 작동하지 않습니다. 앤티 앨리어싱의 결과로보기의 왼쪽과 오른쪽에 얇은 세로 테두리가 만들어집니다.

이 버전은 완벽하게 작동합니다. 또한 테두리 너비를 독립적으로 설정할 수 있으며 원하는 경우 왼쪽 / 오른쪽에 테두리를 추가 할 수도 있습니다. 유일한 단점은 투명성을 지원하지 않는다는 것입니다.

/res/drawable/top_bottom_borders.xml아래 코드로 이름이 지정된 XML 드로어 블을 만들고 TextView의 배경 속성으로 지정하십시오.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#DDDD00" /> <!-- border color -->
        </shape>
    </item>

    <item
        android:bottom="1dp"
        android:top="1dp">   <!-- adjust borders width here -->
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />  <!-- background color -->
        </shape>
    </item>
</layer-list>

마시멜로를 통해 안드로이드 킷캣에서 테스트


답변

그래서 ListView 디바이더를 시뮬레이션하기 위해 약간 다른 무언가를 원했습니다. Piet Delport의 답변을 수정하고 이것을 얻었습니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
   <item>
      <shape
        android:shape="rectangle">
            <solid android:color="@color/background_trans_light" />

        </shape>
   </item>

    <!-- this mess is what we have to do to get a bottom border only. -->
   <item android:top="-2dp"
         android:left="-2dp"
         android:right="-2dp"
         android:bottom="1px">
      <shape
        android:shape="rectangle">
            <stroke android:width="1dp" android:color="@color/background_trans_mid" />
            <solid android:color="@null" />
        </shape>
   </item>

</layer-list>

dp 대신 px를 사용하여 정확히 1 픽셀 구분선을 얻으십시오 (일부 전화 DPI에서는 1dp 선이 사라짐).


답변

@Nic Hubbard가 말했듯이 경계선을 추가하는 매우 쉬운 방법이 있습니다.

<View
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#000000" >
</View>

높이와 배경색을 원하는대로 변경할 수 있습니다.