Implementar una aplicación que permita consultar una tabla de productos por su código.
Tenemos la tabla en un servidor web llamada:
create table articulos (
codigo int primary key AUTO_INCREMENT,
descripcion varchar(50),
precio float
);
Crearemos el proyecto 'Compose22'
Agregamos las dependencias de la biblioteca Volley:
dependencies {
...
implementation 'com.android.volley:volley:1.2.0'
}
Nuestra aplicación debe acceder a internet por lo que debemos pedir dicho permiso:
<uses-permission android:name="android.permission.INTERNET"/>
Debemos llamar a la URL:
https://scratchya.com.ar/videosandroidjava/volley/consultar.php?codigo=?
En el servidor hay un archivo en PHP llamado 'consultar.php':
<?php
header('Content-Type: application/json');
require("conexion.php");
$conexion = retornarConexion();
$datos = mysqli_query($conexion, "select codigo,descripcion,precio from articulos where codigo=$_GET[codigo]");
$resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
echo json_encode($resultado);
?>
Y un segundo archivo 'conexion.php'
<?php
function retornarConexion() {
$server="localhost";
$usuario="xxxx";
$clave="xxxx";
$base="xxxx";
$con=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ;
mysqli_set_charset($con,'utf8');
return $con;
}
?>
La interfaz visual que debemos implementar con Compose debe ser similar a:

El código a implementar en Kotlin para obtener dicha funcionalidad es:
package com.tutorialesprogramacionya.compose22
import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.Button
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import com.android.volley.Request
import org.json.JSONException
import org.json.JSONObject
import com.android.volley.toolbox.JsonArrayRequest
import com.android.volley.toolbox.Volley
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ConsultaArticulo()
}
}
}
@Composable
fun ConsultaArticulo() {
val contexto = LocalContext.current
Column(
modifier = Modifier.fillMaxSize()
) {
var codigo by remember { mutableStateOf("") }
var descripcion by remember { mutableStateOf("") }
var precio by remember { mutableStateOf("") }
var mensaje by remember { mutableStateOf("") }
OutlinedTextField(
value = codigo,
onValueChange = { codigo = it },
label = {
Text("Código")
},
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
OutlinedTextField(
value = descripcion,
onValueChange = { descripcion = it },
label = {
Text("Descripción")
},
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
singleLine = true
)
OutlinedTextField(
value = precio,
onValueChange = { precio = it },
label = {
Text("Precio")
},
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
Button(
onClick = {
ConsultaCodigo(
codigo = codigo.toString(),
respuesta = {
if (it!=null) {
descripcion = it.descripcion
precio = it.precio.toString()
mensaje=""
} else {
mensaje = "No existe el código de producto ingresado"
descripcion=""
precio=""
}
},
contexto = contexto
)
},
modifier = Modifier.padding(10.dp)
) {
Text(text = "Consultar por código")
}
Text(text = "$mensaje")
}
}
data class Articulo(val codigo: Int, val descripcion: String, val precio: Float)
fun ConsultaCodigo(codigo: String, respuesta: (Articulo?) -> Unit, contexto: Context) {
val requestQueue = Volley.newRequestQueue(contexto)
val url = "https://scratchya.com.ar/videosandroidjava/volley/consultar.php?codigo=$codigo"
val requerimiento = JsonArrayRequest(
Request.Method.GET,
url,
null,
{ response ->
if (response.length() == 1) {
try {
val objeto = JSONObject(response[0].toString())
val articulo = Articulo(
objeto.getString("codigo").toInt(),
objeto.getString("descripcion"),
objeto.getString("precio").toFloat()
)
respuesta(articulo)
} catch (e: JSONException) {
}
}
else
respuesta(null);
}
) { error ->
}
requestQueue.add(requerimiento)
}
Declaramos un data class que representa una fila de la tabla 'articulos' existente en el servidor de Internet:
data class Articulo(val codigo: Int, val descripcion: String, val precio: Float)
Cuando se presiona el botón 'Consultar por código' se procede a llamar a la función 'ConsultaCodigo' y se le pasa el código de producto a consultar y mediante una función lambda se recepta la respuesta de la función con el registro del producto consultado o null en el caso que el código ingresado no exista:
Button(
onClick = {
ConsultaCodigo(
codigo = codigo.toString(),
respuesta = {
if (it!=null) {
descripcion = it.descripcion
precio = it.precio.toString()
mensaje=""
} else {
mensaje = "No existe el código de producto ingresado"
descripcion=""
precio=""
}
},
contexto = contexto
)
},
modifier = Modifier.padding(10.dp)
) {
Text(text = "Consultar por código")
}
La función ConsultaCodigo procede a crear un objeto de la clase JsonArrayRequest y cuando obtenemos la respuesta si no está vacío creamos un objeto de la clase Articulo y cargamos sus 3 atributos y procedemos a llamar a la función lambda de la otra función, gracias al parámetro respuesta:
fun ConsultaCodigo(codigo: String, respuesta: (Articulo?) -> Unit, contexto: Context) {
val requestQueue = Volley.newRequestQueue(contexto)
val url = "https://scratchya.com.ar/videosandroidjava/volley/consultar.php?codigo=$codigo"
val requerimiento = JsonArrayRequest(
Request.Method.GET,
url,
null,
{ response ->
if (response.length() == 1) {
try {
val objeto = JSONObject(response[0].toString())
val articulo = Articulo(
objeto.getString("codigo").toInt(),
objeto.getString("descripcion"),
objeto.getString("precio").toFloat()
)
respuesta(articulo)
} catch (e: JSONException) {
}
}
else
respuesta(null);
}
) { error ->
}
requestQueue.add(requerimiento)
}
En el caso que el código de artículo no exista llamamos a respuesta pasando el valor null.
Este proyecto lo puede descargar en un zip desde este enlace: Compose22.zip