¿Hay una manera fácil de agregar un borde a la parte superior e inferior de una vista Android?
-
22-09-2019 - |
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?
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 View
s 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;
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.