我有一个TextView,我想添加一个黑色边界沿其顶部和底部边界。我尝试添加android:drawableTop和android:drawableBottom到TextView,但这只会导致整个视图变成黑色。

<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" />

有没有一种方法可以轻松地添加一个顶部和底部边界的视图(特别是TextView)在Android?


当前回答

我使用了一个技巧,使边框显示在容器之外。使用此技巧只绘制一条线,因此背景将显示底层视图。

<?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>

其他回答

就像@Nic Hubbard说的,有一个非常简单的方法来添加边界线。

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

你可以改变高度和背景颜色为任何你想要的。

选项1:Shape 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>

如果你不想填充,你可以去掉固体。set background="@drawable/your_shape_drawable"在你的布局/视图。

选项2:背景视图

这是我在RelativeLayout中使用的一个小技巧。基本上,你在视图下有一个黑色的正方形,你想给它一个边框,然后给这个视图一些填充(不是边距!),这样黑色的正方形就会在边缘显示出来。

显然,这只有在视图没有任何透明区域时才能正常工作。如果是这样的话,我建议你写一个只画边界的自定义边界视图——它应该只有几十行代码。

<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中有一个背景,它就不起作用了,因为有一个错误会阻止你用视图填充RelativeLayout。在这种情况下,我建议使用Shape drawable。

选项3:9-patch

最后一个选项是使用一个9补丁的可绘制图,如下图所示:

你可以在任何视图上使用它,你可以设置android:background="@drawable/…"是的,它确实需要6x6 -我试过5x5,但它不起作用。

这种方法的缺点是你不能很容易地改变颜色,但如果你想要花哨的边框(例如,只有顶部和底部的边框,就像这个问题一样),那么你可能无法用Shape drawable来做这些,这不是很强大。

选项4:额外的视图

我忘记提到这个非常简单的选项,如果你只想让边界在视图的上方和下方。你可以把你的视图放在一个垂直的线性布局中(如果它还没有),然后在它的上面和下面添加空视图,就像这样:

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

使用InsetDrawable添加边界的最简单方法,下面只显示顶部边界:

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

        <solid android:color="@color/light_gray" />
        <stroke
            android:width=".5dp"
            android:color="@color/dark_gray" />
    </shape>
</inset>

要改变这一点:

<TextView
    android:text="My text"
    android:background="@drawable/top_bottom_border"/>

我更喜欢“drawable/top_bottom_border.xml”中的这种方法:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <gradient
                android:angle="270"
                android:startColor="#000"
                android:centerColor="@android:color/transparent"
                android:centerX="0.01" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:angle="90"
                android:startColor="#000"
                android:centerColor="@android:color/transparent"
                android:centerX="0.01" />
        </shape>
    </item>
</layer-list>

这只是使边界,而不是一个矩形,将出现,如果你的背景有颜色。

您可以通过以下代码片段来实现这一点-

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Minus (-) how much dp you gave in the stroke width from left right-->
    <item android:left="-10dp" android:right="-10dp">
        <shape
            android:shape="rectangle">
            <stroke android:width="10dp" android:color="@android:color/holo_red_dark" />
           <!--This is the main background -->
            <solid android:color="#FFDDDDDD" />
        </shape>
    </item>
</layer-list>

预览,