Views y ViewGroups
En Android, todo lo que ves en pantalla es una View. Un botón, un texto, una imagen — todos son Views. Los ViewGroups son Views que pueden contener otras Views: son los contenedores o layouts.
Los layouts se definen en archivos XML dentro de res/layout/. Android los infla (convierte en objetos Java/Kotlin en memoria) cuando los usás con setContentView().
ConstraintLayout
Es el layout más potente y recomendado para interfaces complejas. Permite posicionar Views con relaciones entre ellas o con el contenedor padre, sin necesidad de anidar layouts.
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvTitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hola Mundo"
android:textSize="24sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="32dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
Atributos clavematch_parent hace que la View ocupe todo el espacio disponible del padre. wrap_content la ajusta al tamaño mínimo necesario para mostrar su contenido.
LinearLayout
Organiza Views en una sola fila (horizontal) o columna (vertical). Más simple que ConstraintLayout, ideal para listas cortas o formularios:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Nombre" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Ingresá tu nombre" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Guardar" />
</LinearLayout>
Views más usadas
TextView— muestra texto. Atributos principales:android:text,android:textSize,android:textColor.EditText— campo de texto editable. Usáandroid:inputTypepara definir si es número, email, contraseña, etc.Button— botón clickeable. Asignale un listener desde Kotlin.ImageView— muestra imágenes. Cargá imágenes conandroid:srcen XML o con Glide/Coil desde código.RecyclerView— lista eficiente de elementos. La más importante para apps reales, tiene su propio curso.
View Binding
En lugar de usar findViewById() (tedioso y propenso a crashes en runtime), Android ofrece View Binding: genera automáticamente una clase de binding con referencias a todas las Views con android:id.
Para habilitarlo, agregá esto en build.gradle (app):
android {
...
buildFeatures {
viewBinding = true
}
}
Luego en tu Activity:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Accedés a las Views directamente, con type-safe
binding.tvTitulo.text = "¡Hola!"
binding.btnAccion.setOnClickListener {
// click del botón
}
}
}
TipUsá siempre View Binding en lugar de findViewById. Es más seguro (null-safe), más legible y no agrega overhead en runtime.