¿Hay una manera fácil de agregar un borde a la parte superior e inferior de una vista Android?

StackOverflow https://stackoverflow.com/questions/1598119

Pregunta

Tengo un TextView y me gustaría añadir un borde negro a lo largo de su bordes superior e inferior. He intentado añadir android:drawableTop y android:drawableBottom a la Vista de Texto, pero que sólo causó todo el fin de convertirse en negro.

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

¿Hay una manera de añadir fácilmente un borde superior e inferior a una vista (en particular, un TextView) en Android?

¿Fue útil?

Solución

En Android 2.2 que podría hacer lo siguiente.

Crear una dibujable XML como /res/drawable/textlines.xml y asignar esta propiedad como los antecedentes de un 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>

El lado negativo de esto es que usted tiene que especificar un color de fondo opaco, como transparencias no funcionará. (Al menos pensé que lo hicieron, pero yo estaba equivocado). En el ejemplo anterior se puede ver que el color sólido de la primera forma #FFdddddd se copia en el segundo color de trazos.

Otros consejos

He usado un truco para que se muestre la frontera exterior del contenedor. Con este truco sólo se dibuja una línea por lo que se mostrará el fondo de la vista subyacente.

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

Opción 1: Forma Disponibles

Esta es la opción más sencilla si quieres un borde alrededor de un diseño o vista en la que se puede establecer el fondo. Crear un archivo XML en la carpeta drawable que se ve algo como esto:

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

Se puede quitar la solid si no desea un relleno. El background="@drawable/your_shape_drawable" conjunto de su diseño / vista.

Opción 2: Antecedentes Ver

He aquí un truco poco que he usado en un RelativeLayout. Básicamente, usted tiene un cuadrado negro bajo la vista que desea darle un borde, y luego da ese punto de vista algo de relleno (no margen!) Por lo que los programas de cuadrados negros a través de los bordes.

Obviamente, esto sólo funciona correctamente si la vista no tiene ningún áreas transparentes. Si lo hace se lo recomendaría a escribir un BorderView costumbre que sólo dibuja la frontera -. Sólo debería ser unas pocas docenas de líneas de código

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

Si usted se está preguntando, que hace trabajo con adjustViewBounds=true. Sin embargo, no funciona si usted quiere tener un fondo en toda una RelativeLayout, porque hay un error que impide que llenar un RelativeLayout con un View. En ese caso, me gustaría recomendar el dibujable Shape.

Opción 3: 9-patch

Una última opción es utilizar un estirable 9-parche como este:

Se puede utilizar en cualquier caso donde se puede establecer android:background="@drawable/...". Y sí lo hace necesidad de ser 6x6 -. Me trató de 5x5 y no hizo el trabajo

La desventaja de este método es que no puede cambiar los colores con mucha facilidad, pero si quieres fronteras de fantasía (por ejemplo, sólo un borde en la parte superior e inferior, como en esta pregunta), entonces no puede ser capaz de hacerlas con el dibujable Shape, que no es muy potente.

Opción 4: vistas adicionales

Me olvidé de mencionar esta opción muy simple si solo deseas fronteras encima y por debajo de su punto de vista. Usted puede poner su vista en un LinearLayout vertical (si no lo está ya) y luego se agrega Views vacías encima y por debajo de esta manera:

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

Para añadir un borde blanco en 1dp solamente la parte inferior y tener un fondo transparente se puede utilizar el siguiente que es más simple que la mayoría de las respuestas aquí.

Para el TextView u otro complemento vista:

android:background="@drawable/borderbottom"

Y en el directorio drawable añadir el siguiente código XML, llamado 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>

Si desea dejar un borde en la parte superior, cambie el android:top="-2dp" a android:bottom="-2dp"

El color no tiene que ser de color blanco y el fondo no tiene que ser transparente, ya sea.

El elemento solid puede no ser necesaria. Esto dependerá de su diseño (gracias V. Kalyuzhnyu).

Básicamente, este XML creará una frontera utilizando la forma rectangular, pero luego empuja la parte superior, los lados derecho e izquierdo más allá del área rinde por la forma. Esto deja sólo el borde inferior visible.

Así que quería hacer algo un poco diferente: un borde en la parte inferior solamente, para simular un divisor ListView. He modificado la respuesta de Piet Delport y obtuve esto:

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

Nota usando píxeles en lugar de DP para obtener exactamente 1 divisor de píxel (algunos inhaladores de polvo seco de teléfono hará una línea 1DP desaparecer).

La respuesta aceptada actualmente no funciona. Se crea bordes verticales delgadas en los lados izquierdo y derecho de la vista como resultado de anti-aliasing.

Esta versión funciona perfectamente. También le permite establecer los anchos de borde de forma independiente, y también se puede añadir bordes en los lados izquierdo / derecho si lo desea. El único inconveniente es que no soporta transparencias.

Crear una dibujable XML denominado /res/drawable/top_bottom_borders.xml con el código abajo y asignarla como propiedad de un fondo de Vista de Texto.

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

Probado en Android KitKat a través de la melcocha

Al igual que dijo @Nic Hubbard, hay una manera muy fácil añadir una línea de frontera.

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

Puede cambiar la altura y el color de fondo a lo que desea.

También puede envolver la vista en un FrameLayout, a continuación, establecer el color de fondo del marco y el relleno a lo que quiere; sin embargo, el TextView, por defecto tiene un fondo 'transparente', por lo que había necesidad de cambiar el color de fondo de la TextView también.

Mis respuestas se basan en la versión @Emile pero utilizan el color transparente en lugar de sólido.
En este ejemplo se dibujará un borde inferior 2DP.

<?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="2dp"
                     android:color="#50C0E9" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item  android:bottom="2dp" >
        <shape android:shape="rectangle" >
            <stroke  android:width="2dp"
                     android:color="@color/bgcolor" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

@ del color / bgcolor es el color del fondo en wich se dibuja la vista con la frontera.

Si desea cambiar la posición del cambio frontera el desplazamiento con uno de:

android:bottom="2dp"
android:top="2dp"
android:right="2dp"
android:left="2dp"

o combinarlos para tener 2 o más fronteras:

android:bottom="2dp" android:top="2dp"

¿Por qué no crear un alto punto de vista 1DP con un color de fondo? A continuación se puede colocar fácilmente en la que desea.

Sólo para añadir mi solución a la lista ..

Yo quería un borde inferior semi transparente que se extiende más allá de la forma original (Así la frontera semitransparente fue fuera el rectángulo de los padres).

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <shape android:shape="rectangle" >      
      <solid android:color="#33000000" /> <!-- Border colour -->
    </shape>
  </item>
  <item  android:bottom="2dp" >
    <shape android:shape="rectangle" >     
      <solid android:color="#164586" />
    </shape>
  </item>
</layer-list>

Lo que me da;

introducir descripción de la imagen aquí

En primer lugar hacer un archivo XML con los contenidos que se muestran a continuación y el nombre que border.xml y lugar dentro de la carpeta de diseño dentro del directorio res

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp" android:color="#0000" />
    <padding android:left="0dp" android:top="1dp" android:right="0dp"
        android:bottom="1dp" />
</shape>

Después de que el interior de la utilización de código

TextView tv = (TextView)findElementById(R.id.yourTextView);
tv.setBackgroundResource(R.layout.border);

Esto hará que una línea de negro en la parte superior e inferior de la Vista de Texto.

Para cambiar esto:

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

Yo prefiero este enfoque en "/ top_bottom_border.xml estirable":

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

Esto sólo hace que las fronteras, no un rectángulo que aparecerán si su fondo tiene un color.

Anote a continuación el código

<View
    android:layout_width="wrap_content"
    android:layout_height="2dip"
    android:layout_below="@+id/topics_text"
    android:layout_marginTop="7dp"
    android:layout_margin="10dp"
    android:background="#ffffff" />

forma más sencilla de añadir bordes a la inserción de las fronteras utilizando InsetDrawable, siguiendo mostrará el borde superior solamente:

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

Trate de envolver la imagen con un LinearLayout, y configurarlo de fondo al color de borde que desea todo el texto. A continuación, establezca el relleno en el TextView ser el grosor que desea para su frontera.

También puede utilizar una ruta de 9 para hacer su trabajo. Crearlo de manera que de píxeles de color no se multiplican en la altura, pero sólo el píxel transparente.

Esta es una manera de lograrlo.

    <?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="@color/grey_coaching_text" />
            </shape>
        </item>

        <item
            android:bottom="1dp"
            android:top="1dp">
            <shape android:shape="rectangle">
                <solid android:color="@color/white" />
            </shape>
        </item>
    </layer-list>

Primer elemento para el accidente cerebrovascular y la segunda para el fondo sólido. Ocultar los bordes izquierdo y derecho.

Simplemente añadir Vistas en la parte superior e inferior de la View

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/your_color"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:gravity="center"
        android:text="Testing"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/your_color"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

</android.support.constraint.ConstraintLayout>
// Just simply add border around the image view or view

<ImageView
                android:id="@+id/imageView2"
                android:layout_width="90dp"
                android:layout_height="70dp"
                android:layout_centerVertical="true"
                android:layout_marginRight="10dp"
                android:layout_toLeftOf="@+id/imageView1"
                android:background="@android:color/white"
                android:padding="5dip" />

// After that dynamically put color into your view or image view object

objView.setBackgroundColor(Color.GREEN);

//VinodJ/Abhishek
<shape xmlns:android="http://schemas.android.com/apk/res/android">

<solid android:color="@color/light_grey1" />
<stroke
    android:width="1dip"
    android:color="@color/light_grey1" />

<corners
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    android:topLeftRadius="5dp"
    android:topRightRadius="5dp" />

    </shape>
<TextView
    android:id="@+id/textView3"
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#72cdf4"
    android:text=" aa" />

Sólo Añadir este TextView debajo del texto en el que desea agregar el borde

Sólo para cumplir de @phreakhead y respuestas de user1051892, <item android:bottom|android:left|android:right|android:top> si es negativo, se debe a ser mayor que <stroke android:width>. Si no es así, teléfono tiene un diseño pintura se mezcla con stroke's pintura y usted puede pensar que estos valores no están trabajando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top