
emby
Tengo un TextView y me gustaría agregar un borde negro a lo largo de sus bordes superior e inferior. Traté de agregar android:drawableTop
y android:drawableBottom
a TextView, pero eso solo provocó que toda la vista se volviera negra.
<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 alguna manera de agregar fácilmente un borde superior e inferior a una vista (en particular, un TextView) en Android?

emilio
En android 2.2 podrías hacer lo siguiente.
Cree un dibujo xml como /res/drawable/textlines.xml y asígnelo como propiedad de fondo de TextView.
<TextView
android:text="My text with lines above and below"
android:background="@drawable/textlines"
/>
/res/dibujable/líneas de texto.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>
La desventaja de esto es que debe especificar un color de fondo opaco, ya que las transparencias no funcionarán. (Al menos pensé que lo hicieron, pero me equivoqué). En el ejemplo anterior, puede ver que el color sólido de la primera forma #FFdddddd se copia en el color del trazo de la segunda forma.

usuario1051892
He usado un truco para que el borde se muestre fuera del contenedor. Con este truco, solo se dibuja una línea para que se muestre 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>

tigre
Para agregar un 1dp
borde blanco solo en la parte inferior y para tener un fondo transparente, puede usar lo siguiente, que es más simple que la mayoría de las respuestas aquí.
Para el TextView
u otra vista agregar:
android:background="@drawable/borderbottom"
Y en el drawable
directorio agregue el siguiente 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 un borde en la parte superior, cambie el android:top="-2dp"
para android:bottom="-2dp"
No es necesario que el color sea blanco y que el fondo tampoco sea transparente.
los solid
Es posible que no se requiera el elemento. Esto dependerá de su diseño (gracias V. Kalyuzhnyu).
Básicamente, este XML creará un borde usando la forma del rectángulo, pero luego empujará los lados superior, derecho e izquierdo más allá del área de representación de la forma. Esto deja solo el borde inferior visible.

timmmm
Opción 1: Forma dibujable
Esta es la opción más simple si desea un borde alrededor de un diseño o vista en el que pueda configurar el fondo. Cree un archivo XML en el drawable
carpeta que se parece a 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>
Puedes quitar el solid
si no quieres un relleno. El conjunto background="@drawable/your_shape_drawable"
en su diseño/vista.
Opción 2: Vista de fondo
Aquí hay un pequeño truco que he usado en un RelativeLayout
. Básicamente, tiene un cuadrado negro debajo de la vista a la que desea dar un borde, y luego le da a esa vista algo de relleno (¡no margen!) para que el cuadrado negro se vea en los bordes.
Obviamente, esto solo funciona correctamente si la vista no tiene áreas transparentes. Si es así, le recomendaría que escribiera un personalizado. BorderView
que solo dibuja el borde: solo debe tener 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="https://stackoverflow.com/questions/1598119/@drawable/..." />
Si te lo preguntas, es lo hace trabajar con adjustViewBounds=true
. Sin embargo, no funciona si desea tener un fondo en todo un RelativeLayout
porque hay un error que te impide llenar un RelativeLayout
con un View
. En ese caso, recomendaría el Shape
dibujable.
Opción 3: 9 parches
Una opción final es usar un diseño de 9 parches como este:

Puede usarlo en cualquier vista donde pueda establecer android:background="https://stackoverflow.com/questions/1598119/@drawable/..."
. Y sí, tiene que ser 6×6. Probé 5×5 y no funcionó.
La desventaja de este método es que no puede cambiar los colores muy fácilmente, pero si desea bordes elegantes (por ejemplo, solo un borde en la parte superior e inferior, como en esta pregunta), es posible que no pueda hacerlo con el Shape
dibujable, que no es muy potente.
Opción 4: Vistas adicionales
Olvidé mencionar esta opción realmente simple si solo desea bordes arriba y abajo de su vista. Puedes poner tu vista en una vertical. LinearLayout
(si aún no lo está) y luego agregue vacío View
s por encima y por debajo de esta manera:
<View android:background="#000" android:layout_width="match_parent" android:layout_height="1px"/>

gregschlom
La respuesta actualmente aceptada no funciona. Crea bordes verticales delgados en los lados izquierdo y derecho de la vista como resultado del suavizado.
Esta versión funciona perfectamente. También le permite establecer los anchos de los bordes de forma independiente, y también puede agregar bordes en los lados izquierdo/derecho si lo desea. El único inconveniente es que NO admite transparencia.
Crea un dibujo xml llamado /res/drawable/top_bottom_borders.xml
con el siguiente código y asígnelo como propiedad de fondo de 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>
Probado en Android KitKat a través de Marshmallow

cabeza de phreak
Así que quería hacer algo ligeramente diferente: un borde en la parte inferior SOLAMENTE, para simular un divisor ListView. Modifiqué 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>
Tenga en cuenta el uso de px en lugar de dp para obtener exactamente un divisor de 1 píxel (algunos DPI de teléfonos harán que desaparezca una línea de 1 dp).

matez
Tal como dijo @Nic Hubbard, hay una manera muy fácil de agregar una línea de borde.
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#000000" >
</View>
Puedes cambiar la altura y el color de fondo a lo que quieras.
Es sorprendente que nadie haya mencionado divisorVertical ! Esta es la cosa creada por Android, para lograr, bueno, divisores verticales. No podría ser más fácil y usted hace todo en el panel WYSIWYG “Diseño” en Android Studio.
– Gordito
26 de junio de 2014 a las 10:52
nota dividerVertical se implementó en API 11.
– JPM
26 de febrero de 2015 a las 18:04
¿Quizás puedas mostrar cómo usar dividerVertical?
– chico androide
24 de febrero de 2017 a las 1:50