1. Buttons
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Iniciar Sesión"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:backgroundTint="@color/red"
android:textColor="@color/black"
android:gravity="center"
android:drawableLeft="@drawable/car"
/>
android:layout_width y android:layout_height: Estos parámetros especifican el ancho y alto del botón. En este caso, se establecen en “wrap_content”, lo que significa que el tamaño del botón se ajustará automáticamente según el contenido.
android:text: Este parámetro establece el texto que se mostrará en el botón. En este caso, se establece en “Iniciar Sesión”.
android:paddingLeft y android:paddingRight: Estos parámetros establecen el relleno (padding) izquierdo y derecho del botón. En este caso, se establecen en 10dp, lo que significa que habrá un espacio de 10 píxeles a la izquierda y a la derecha del texto del botón.
android:backgroundTint: Este parámetro establece el color de fondo del botón. En este caso, se establece en “@color/red”, lo que indica que el color de fondo será el definido en el recurso de color llamado “red” (probablemente un color rojo).
android:textColor: Este parámetro establece el color del texto del botón. En este caso, se establece en “@color/black”, lo que indica que el color del texto será el definido en el recurso de color llamado “black” (probablemente un color negro).
android:gravity: Este parámetro establece la alineación del texto dentro del botón. En este caso, se establece en “center”, lo que significa que el texto se alineará en el centro del botón tanto horizontal como verticalmente.
android:drawableLeft: Este parámetro establece una imagen o icono que se colocará a la izquierda del texto del botón. En este caso, se establece en “@drawable/car”, lo que indica que se usará el recurso de imagen llamado “car”.
Estos son solo algunos de los parámetros disponibles para personalizar un botón en Android. Puedes utilizar otros parámetros según tus necesidades, como establecer un icono a la derecha del texto (android:drawableEnd), cambiar la fuente (android:typeface),
2. Personalizar Buttons
corners.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="12dp"/>
<corners android:topLeftRadius="0dp"/>
</shape>
</item>
</selector>
oval.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/green"/>
<size android:width="120dp" android:height="120dp"/>
</shape>
</item>
</selector>
Y a continuación se especifica en la propiedad background
android:background="@drawable/oval“
android:background="@drawable/corners"
3. AppComcatButton
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PruActivity">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/bntBoton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Botón"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.wildrunning
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.appcompat.widget.AppCompatButton
class PruActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pru)
var bntBoton=findViewById<AppCompatButton>(R.id.bntBoton)
bntBoton.setOnClickListener {
Log.i ("Javi","Botón pulsado")
}
}
}
4. ImageButton
<android.widget.ImageButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/green"
android:src="@drawable/car"
/>
class buttons : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_buttons)
var btBoton=findViewById<Button>(R.id.btBoton)
btBoton.setOnClickListener {
Toast.makeText(this,"Botón pulsado",Toast.LENGTH_SHORT).show()
}
var btImageBoton=findViewById<ImageButton>(R.id.imageBoton)
btImageBoton.setOnClickListener {
Toast.makeText(this,"Botón pulsado",Toast.LENGTH_SHORT).show()
}
}
5. ChipGroup y Chip
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:chipSpacing="8dp"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:id="@+id/chip1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Opción 1" />
<com.google.android.material.chip.Chip
android:id="@+id/chip2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Opción 2" />
<com.google.android.material.chip.Chip
android:id="@+id/chip3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Opción 3" />
</com.google.android.material.chip.ChipGroup>
6. Personalizar ChipGroup
Dentro de la carpeta themes, en el archivo themes.xml se definen los estilos
<style name="chEntry" parent="Widget.MaterialComponents.Chip.Entry">
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/white</item>
<item name="chipBackgroundColor">@color/purple</item>
<item name="chipStrokeColor">@color/blue</item>
<item name="chipStrokeWidth">2dp</item>
</style>
Y dentro del XML de la Activity
<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Texto 1"
style="@style/chEntry"
/>
<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Texto 2"
style="@style/chEntry"
/>
</com.google.android.material.chip.ChipGroup>
var cgCondiciones=findViewById<ChipGroup>(R.id.cgCondiciones)
var chip: Chip
for (i in 0..cgCondiciones.childCount-1){
chip=cgCondiciones.getChildAt(i) as Chip
chip.setOnCloseIconClickListener {
cgCondiciones.removeView(it)
}
chip.setOnClickListener {
var aux = it as Chip
Toast.makeText(this,"Opcion ${aux.text}",Toast.LENGTH_SHORT).show()
}
}
7. RadioButton
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RadioGroup
android:id="@+id/rgVacaciones"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rbPlaya"
android:text="Playa"
android:checked="true"
android:buttonTint="@color/green" />
<RadioButton
android:id="@+id/rbMontana"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Montaña"/>
</RadioGroup>
</LinearLayout>
var rbPlaya=findViewById<RadioButton>(R.id.rbPlaya)
var rbMontana=findViewById<RadioButton>(R.id.rbMontana)
rbPlaya.setOnClickListener {
Log.d("JAI", "Pulsado Playa")
}
rbMontana.setOnClickListener {
Log.d("JAI", "Pulsado Montana")
}
8. RadioButton personalizados
rb_car_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/rb_car_on" android:state_checked="true"/>
<item android:drawable="@drawable/rb_car_off" android:state_checked="false"/>
</selector>
rb_car_on.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp"/>
<solid android:color="@color/green"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_car"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
rb_car_off.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp"/>
<solid android:color="@color/blue"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_car"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
rb_train_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/rb_train_on" android:state_checked="true"/>
<item android:drawable="@drawable/rb_train_off" android:state_checked="false"/>
</selector>
rb_train_on.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners
android:bottomRightRadius="10dp"
android:topRightRadius="10dp"/>
<solid android:color="@color/green"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_train"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
rb_train_off.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners
android:bottomRightRadius="10dp"
android:topRightRadius="10dp"/>
<solid android:color="@color/blue"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_train"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
rb_plane_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/rb_plane_on" android:state_checked="true"/>
<item android:drawable="@drawable/rb_plane_off" android:state_checked="false"/>
</selector>
rb_plane_on.xml
<?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/green"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_plane"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
rb_plane_off.xml
<?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/blue"/>
</shape>
</item>
<item
android:drawable="@drawable/ic_plane"
android:bottom="10dp"
android:left="10dp"
android:right="10dp"
android:top="10dp"/>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
<RadioGroup
android:id="@+id/rgOptions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rbCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rb_car_bg"
android:button="@null"
/>
<RadioButton
android:id="@+id/rbPlane"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rb_plane_bg"
android:button="@null"
/>
<RadioButton
android:id="@+id/rbTrain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rb_train_bg"
android:button="@null"
/>
</RadioGroup>
</LinearLayout>
9. CheckBox desde xml
<CheckBox
android:id="@+id/cbSeguro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Seguro de Viaje"
android:checked="true"
android:enabled="false"
/>
<CheckBox
android:id="@+id/cbCancelable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Reserva Cancelable"
android:buttonTint="@color/green"
android:enabled="true"
/>
10. CheckBox desde xml – Personalización
cb_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/cb_custom_on" android:state_checked="true" />
<item android:drawable="@drawable/cb_custom_off" android:state_checked="false" />
</selector>
cb_custom_off
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportHeight="48"
android:viewportWidth="48">
<group
android:scaleX=".2"
android:scaleY=".2"
android:translateX="6"
android:translateY="6">
<group
android:scaleX="7.5"
android:scaleY="7.5">
<path
android:fillColor="#6E6E6E"
android:pathData="M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</group>
</group>
</vector>
cb_custom_on
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportHeight="48"
android:viewportWidth="48">
<group
android:scaleX=".2"
android:scaleY=".2"
android:translateX="6"
android:translateY="6">
<group
android:scaleX="7.5"
android:scaleY="7.5">
<path
android:fillColor="#45D0BB"
android:pathData="M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z" />
</group>
</group>
</vector>
<CheckBox
android:id="@+id/cbCustom1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Check custom"
android:button="@drawable/cb_custom"
android:enabled="true"
/>
<CheckBox
android:id="@+id/cbCustom2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Check custom2"
android:button="@drawable/cb_custom"
android:checked="true"
android:enabled="true"
/>
11. CheckBox desde código
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/cbSeguro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Seguro de Viaje"
android:checked="true"
android:enabled="false"
android:button="@drawable/cb_custom"
/>
<CheckBox
android:id="@+id/cbCancelable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Reserva Cancelable"
android:buttonTint="@color/green"
android:enabled="true"
android:button="@drawable/cb_custom"
/>
</LinearLayout>
var cbSeguro=findViewById<CheckBox>(R.id.cbSeguro)
var cbCancelable=findViewById<CheckBox>(R.id.cbCancelable)
cbSeguro.setOnClickListener {
if (cbSeguro.isChecked)
Toast.makeText(this,"Marcado Seguro",Toast.LENGTH_SHORT).show()
else
Toast.makeText(this,"NO Marcado Seguro",Toast.LENGTH_SHORT).show()
}
cbCancelable.setOnClickListener {
if (cbCancelable.isChecked)
Toast.makeText(this,"Marcado Cancelable",Toast.LENGTH_SHORT).show()
else
Toast.makeText(this,"NO Marcado Cancelable",Toast.LENGTH_SHORT).show()
}
12. ToggleButton desde XML y código
<ToggleButton
android:id="@+id/tgNormal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textOn="Sí"
android:textOff="No"
android:checked="true"
/>
var tbNormal : ToggleButton = findViewById<ToggleButton>(R.id.tgNormal)
tbNormal.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) Toast.makeText(this, "Activo",Toast.LENGTH_SHORT).show()
else Toast.makeText(this, "Inactivo",Toast.LENGTH_SHORT).show()
}
13. ToggleButton personalizado
tg_travel_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:enterFadeDuration="@android:integer/config_shortAnimTime"
android:exitFadeDuration="@android:integer/config_shortAnimTime"
>
<item android:drawable="@drawable/tg_mountain" android:state_checked="true"/>
<item android:drawable="@drawable/tg_beach" android:state_checked="false"/>
</selector>
<ToggleButton
android:id="@+id/tgPersonalizado"
android:layout_width="72dp"
android:layout_height="38dp"
android:checked="true"
android:textOn=""
android:textOff=""
android:background="@drawable/tg_travel_bg"
/>
14. Switch desde xml y código
var swNormal : Switch = findViewById<Switch>(R.id.swNormal)
swNormal.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) Toast.makeText(this, "Activo",Toast.LENGTH_SHORT).show()
else Toast.makeText(this, "Inactivo",Toast.LENGTH_SHORT).show()
}
<Switch
android:id="@+id/swNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notificar cambios por email"
android:thumb="@drawable/ic_car"
android:thumbTint="@color/blue"
android:trackTint="@color/green"
/>
15. Switch Personalizado
sw_thumb.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape android:shape="rectangle">
<solid android:color="#fff"></solid>
<size android:width="50dp"
android:height="40dp"></size>
<corners android:radius="40dp"></corners>
<stroke android:width="2dp" android:color="@color/red"></stroke>
</shape>
</item>
<item android:state_checked="false">
<shape android:shape="rectangle">
<solid android:color="#fff"></solid>
<size android:width="50dp"
android:height="40dp"></size>
<corners android:radius="40dp"></corners>
<stroke android:width="2dp" android:color="@color/green"></stroke>
</shape>
</item>
</selector>
sw_track.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape android:shape="rectangle">
<solid android:color="@color/red"></solid>
<corners android:radius="200dp"></corners>
</shape>
</item>
<item android:state_checked="false">
<shape android:shape="rectangle">
<solid android:color="@color/green"></solid>
<corners android:radius="200dp"></corners>
</shape>
</item>
</selector>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swCustom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="Off"
android:textOn="On"
android:layout_marginStart="10dp"
android:text="Notificación "
app:showText="true"
android:checked="false"
android:thumb="@drawable/sw_thumb"
app:track="@drawable/sw_track"
/>
16. FloatActionButton
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add"
android:contentDescription="@string/add_button"
app:backgroundTint="@color/green"
app:elevation="6dp"
app:rippleColor="@color/red" />
En este ejemplo, hemos utilizado com.google.android.material.floatingactionbutton.FloatingActionButton, que es parte del Material Components Library.
android:id=”@+id/fab“: Se asigna un ID único al FloatingActionButton para poder referenciarlo en el código Kotlin.
android:src=”@drawable/ic_add“: Se establece la imagen del FloatingActionButton utilizando el atributo src. Aquí, se utiliza un recurso de imagen llamado “ic_add” que debería existir en la carpeta drawable.
android:contentDescription=”@string/add_button“: Se establece la descripción del contenido para el FloatingActionButton. Esta descripción se utilizará para accesibilidad y se debe definir en el archivo strings.xml utilizando el recurso @string.
app:backgroundTint=”@color/colorAccent“: Se establece el color de fondo del FloatingActionButton utilizando el atributo backgroundTint. Aquí, se utiliza el recurso de color llamado “colorAccent”.
app:elevation=”6dp”: Se establece la elevación del FloatingActionButton utilizando el atributo elevation. Esto crea una sombra debajo del botón y le da una apariencia elevada.
app:rippleColor=”@color/colorAccent“: Se establece el color de la animación de ondulación (ripple) al hacer clic en el FloatingActionButton. Aquí, se utiliza el recurso de color llamado “colorAccent”.
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_car"
android:layout_gravity="left"
android:layout_margin="10dp"
android:backgroundTint="@color/green"
/>
var fabButton = findViewById<FloatingActionButton>(R.id.fabButton)
fabButton.setOnClickListener {
Toast.makeText(this,"fab Pulsado",Toast.LENGTH_SHORT).show()
}