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

Tengo un TextView y me gustaría agregar un borde negro a lo largo de sus bordes superior e inferior. Intenté agregar android:drawableTop y android:drawableBottom drawableBottom a TextView, pero eso solo hizo que toda la vista se volviera negra.

  

¿Hay alguna manera de agregar fácilmente un borde superior e inferior a una Vista (en particular, una Vista de texto) en Android?

En Android 2.2, podrías hacer lo siguiente.

Cree un dibujable xml como /res/drawable/textlines.xml y asígnelo como propiedad de fondo de TextView.

  

/res/drawable/textlines.xml

                

La desventaja de esto es que debe especificar un color de fondo opaco, ya que las transparencias no funcionarán. (Al menos pensé que sí pero estaba equivocado). En el ejemplo anterior, puede ver que el color sólido de la primera forma #FFdddddd se copia en el color de trazo de la segunda forma.

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.

           

Opción 1: forma extraíble

Esta es la opción más simple si desea un borde alrededor de un diseño o vista en el que pueda establecer el fondo. Cree un archivo XML en la carpeta drawable que se parece a esto:

      

Puedes eliminar el solid si no quieres un relleno. El background="@drawable/your_shape_drawable" establecido 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 RelativeLayout . Básicamente, tiene un cuadrado negro debajo de la vista que desea dar un borde, y luego le da a esa vista algo de relleno (¡no de margen!) Para que el cuadrado negro se vea en los bordes.

Obviamente, esto solo funciona correctamente si la vista no tiene áreas transparentes. Si lo hace, le recomendaría que escriba un BorderView personalizado que solo dibuja el borde, solo debe ser unas pocas docenas de líneas de código.

   

Si te estás preguntando, funciona con adjustViewBounds=true . Sin embargo, no funciona si desea tener un fondo en un RelativeLayout completo, porque hay un error que le impide completar un RelativeLayout con una View . En ese caso, recomendaría la Shape dibujable.

Opción 3: parche 9

Una última opción es usar un parche de 9 parches como este:

Puedes usarlo en cualquier vista donde puedas configurar android:background="@drawable/..." . Y sí, necesita ser 6×6 – Intenté 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), entonces no podrá hacerlos con la Shape dibujable, que no es muy poderoso.

Opción 4: vistas adicionales

Olvidé mencionar esta opción realmente simple si solo quieres bordes arriba y abajo de tu vista. Puede poner su vista en LinearLayout vertical (si no lo está) y luego agregar View vacíos arriba y abajo de esta manera:

  

Para agregar un borde blanco de 1 1dp en la parte inferior solamente y para tener un fondo transparente, puede usar lo siguiente que es más simple que la mayoría de las respuestas aquí.

Para TextView u otra vista, agregue:

 android:background="@drawable/borderbottom" 

Y en el directorio borderbottom.xml , agregue el siguiente XML, llamado borderbottom.xml

          

Si quieres un borde en la parte superior, cambia el android:top="-2dp" a android:bottom="-2dp"

El color no necesita ser blanco y el fondo tampoco tiene que ser transparente.

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

Básicamente, este XML creará un borde usando la forma del rectángulo, pero luego empuja los lados superior, derecho e izquierdo más allá del área de renderizado de la forma. Esto deja solo el borde inferior visible.

Así que quería hacer algo ligeramente diferente: un borde SOLAMENTE en la parte inferior, para simular un divisor ListView. Modifiqué la respuesta de Piet Delport y obtuve esto:

                

Tenga en cuenta usar px en lugar de dp para obtener exactamente 1 divisor de píxeles (algunos DPI de teléfono harán desaparecer una línea de 1dp).

La respuesta actualmente aceptada no funciona. Crea bordes verticales delgados en los lados izquierdo y derecho de la vista como resultado del antialiasing.

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.

Cree un /res/drawable/top_bottom_borders.xml xml llamado /res/drawable/top_bottom_borders.xml con el siguiente código y asígnelo como propiedad de fondo de TextView.

                 

Probado en Android KitKat a través de Marshmallow

Tal como dijo @Nic Hubbard, hay una manera muy fácil de agregar una línea de borde.

   

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

También puede ajustar la vista en FrameLayout, luego establecer el color de fondo y el relleno del marco a lo que desea; sin embargo, la vista de texto, por defecto tiene un fondo ‘transparente’, por lo que también necesitaría cambiar el color de fondo de la vista de texto.

Mis respuestas se basan en la versión @Emile, pero uso un color transparente en lugar de sólido.
Este ejemplo dibujará un borde inferior de 2dp.

                

@ color / bgcolor es el color del fondo en el que dibuja su vista con el borde.

Si desea cambiar la posición del borde, cambie el desplazamiento con uno de:

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

o combínelos para tener 2 o más bordes:

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

¿Por qué no crear una vista de 1dp con un color de fondo? Luego puede colocarse fácilmente donde lo desee.

Primero haga un archivo xml con los contenidos que se muestran a continuación y asígnele el nombre border.xml y colóquelo dentro de la carpeta de diseño dentro del directorio res

      

Después de eso dentro del código use

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

Esto hará una línea negra en la parte superior e inferior de TextView.

Escriba abajo el código

  

Para cambiar esto:

  

Prefiero este enfoque en “drawable / top_bottom_border.xml”:

              

Esto solo hace los bordes, no un rectángulo que aparecerá si tu fondo tiene un color.

Solo para agregar mi solución a la lista …

Quería un borde inferior semitransparente que se extendiera más allá de la forma original (por lo que el borde semitransparente estaba fuera del rectángulo principal).

              

Lo que me da;

enter image description here

Intente envolver la imagen con una distribución lineal y configure su fondo con el color del borde que desee alrededor del texto. Luego configure el relleno en la vista de texto para que sea del grosor que desea para su borde.

También puede usar un 9-path para hacer su trabajo. Créelo para que el pixel coloreado no se multiplique en altura sino solo el píxel transparente.

 // Just simply add border around the image view or view  // After that dynamically put color into your view or image view object objView.setBackgroundColor(Color.GREEN); //VinodJ/Abhishek 
      
  

Simplemente agregue este TextView debajo del texto donde desea agregar el borde