Tecnoaficiones

Las nuevas tecnologías al alcance de todos.

Agregador de canales de noticias

Comunicación limpia entre Fragments usando un Shared ViewModel

Actualidad en Androidsis - Mar, 23/06/2026 - 17:50

Cuando nos metemos en el mundo del desarrollo de Android, uno de los quebraderos de cabeza más comunes es cómo hacer que dos pantallas, o fragmentos, se hablen entre sí sin que el código se convierta en un caos. Para que una aplicación sea escalable, lo ideal es que cada fragmento sea un componente totalmente independiente, con su propio diseño y comportamiento, evitando que dependan directamente unos de otros o de la actividad que los aloja.

Si queremos que la experiencia del usuario sea fluida, necesitamos canales de comunicación eficaces para reaccionar a eventos o compartir estados. Dependiendo de lo que busquemos, Android nos ofrece dos caminos principales: el uso de un ViewModel compartido para datos persistentes y la API de resultados de fragmentos para intercambios de información rápidos y sencillos.

Dominando el Shared ViewModel

El ViewModel es la herramienta estrella cuando necesitamos que varios fragmentos o la actividad anfitriona compartan la misma información. Básicamente, estos objetos se encargan de almacenar y gestionar los datos de la interfaz, asegurando que la información no se pierda aunque el dispositivo rote o cambie su configuración.

Para lograr que dos fragmentos utilicen la misma instancia, el truco está en definir el alcance del ViewModelProvider. Si configuramos la actividad como el dueño del alcance, ambos fragmentos recibirán el mismo objeto. Esto es fundamental porque, si por error usamos el fragmento como alcance, cada uno tendría su propia copia de los datos y la comunicación simplemente no funcionaría.

Es importante tener en cuenta que un ViewModel compartido en una arquitectura de actividad única actúa prácticamente como un singleton en memoria. Los datos persistirán hasta que la actividad sea destruida definitivamente, por lo que debemos gestionar bien el ciclo de vida de las Activity para no consumir recursos innecesariamente.

Implementación Práctica y Flujo de Datos

Imagina que estamos creando una app de pedidos. Necesitamos que el usuario elija la cantidad de productos en una pantalla, el sabor en otra y la fecha de entrega en una tercera. Para esto, creamos una clase OrderViewModel que extienda de ViewModel, donde guardamos las variables necesarias como el precio, la cantidad y la fecha.

Para mantener el código limpio y evitar que cualquier clase externa modifique los datos a su antojo, aplicamos una buena práctica: definimos propiedades mutables privadas con guion bajo (como _quantity) y exponemos una versión inmutable pública mediante LiveData. De este modo, solo el ViewModel puede cambiar el valor, pero cualquier fragmento puede observar el cambio.

Sincronización de la Interfaz con LiveData y Data Binding

Para que la pantalla se actualice sola sin tener que escribir código repetitivo, entra en juego el Data Binding. Al vincular la variable del ViewModel directamente en el archivo XML, podemos hacer que elementos como los RadioButtons se marquen automáticamente si el valor coincide con el guardado en el modelo.

Un punto crítico aquí es la configuración del LifecycleOwner. Para que los observables de LiveData funcionen y la IU se refresque en tiempo real, debemos asignar binding.lifecycleOwner = viewLifecycleOwner. Sin este paso, aunque los datos cambien en el fondo, el usuario seguirá viendo la información antigua en su pantalla.

Cuando necesitamos procesar datos antes de mostrarlos, como convertir un número decimal en una moneda local, utilizamos Transformations.map(). Esta función nos permite transformar un LiveData<Double> en un LiveData<String> formateado, haciendo que la lógica de presentación quede separada de la lógica de negocio.

La API de Resultados de Fragmentos

No siempre necesitamos un ViewModel complejo. Para casos donde solo queremos pasar un dato puntual (como un código QR escaneado) de vuelta a una pantalla anterior, la API de FragmentResult es la opción más ligera. Esta API utiliza el FragmentManager como un almacén central de resultados.

El proceso es sencillo: el fragmento que espera el dato configura un oyente con setFragmentResultListener() usando una clave específica. Mientras tanto, el fragmento que genera la información utiliza setFragmentResult() con esa misma clave. El resultado se entrega en cuanto el fragmento receptor alcanza el estado STARTED.

Si trabajamos con fragmentos secundarios, la clave es usar getChildFragmentManager() en el fragmento padre para escuchar los resultados. Esto mantiene la jerarquía organizada y evita que los datos se dispersen por toda la actividad, permitiendo una comunicación mucho más quirúrgica y eficiente.

Alternativas y enfoques tradicionales

Aunque el ViewModel es la norma actual, existen métodos más antiguos que algunos desarrolladores siguen usando, como la implementación de interfaces personalizadas. En este esquema, el fragmento define una interfaz que la actividad debe implementar, actuando esta última como intermediaria entre dos fragmentos.

Otra técnica rudimentaria consiste en acceder a las vistas de un fragmento desde otro mediante el método getActivity().findViewById(). Sin embargo, este enfoque es altamente desaconsejado en aplicaciones modernas, ya que rompe totalmente la independencia de los fragmentos y provoca errores fatales si el fragmento objetivo no está visible o ha sido destruido.

La arquitectura moderna de Android prioriza que los componentes no se conozcan entre sí. Al delegar la gestión de los datos a un almacén externo como el ViewModel, logramos que el código sea más fácil de testear, mantener y escalar, evitando los típicos fallos de punteros nulos al intentar acceder a vistas que ya no existen en la jerarquía.

La clave para una navegación robusta reside en elegir la herramienta adecuada: el ViewModel compartido para estados complejos y persistentes, y la API de Fragment Result para respuestas rápidas y efímeras, asegurando siempre que el ciclo de vida de los componentes sea respetado para evitar fugas de memoria y errores de ejecución.

Introducción a Clean Architecture: Separando capas en tu aplicación Android

Actualidad en Androidsis - Mar, 23/06/2026 - 16:51

Cuando nos metemos de lleno en el desarrollo de aplicaciones para Android, nos damos cuenta de que mantener la escalabilidad y la legibilidad no es moco de pavo. Si no tenemos un plan arquitectónico sólido, el proyecto puede volverse un auténtico caos a medida que crece, convirtiéndose en lo que comúnmente llamamos código espagueti, donde tocar una línea en un sitio rompe algo en un lugar totalmente inesperado.

Para evitar estos dolores de cabeza, entra en juego la denominada Clean Architecture, popularizada por Robert C. Martin, más conocido como Uncle Bob. Este enfoque no es simplemente una moda, sino una filosofía de diseño que busca que el software sea modular, fácil de testear y mantenible a largo plazo, basándose en la separación estricta de responsabilidades y el respeto a los principios SOLID.

Los pilares de la Arquitectura Limpia

En esencia, Clean Architecture organiza el código en capas concéntricas. La idea fundamental es que las dependencias siempre apunten hacia el interior; es decir, las capas externas pueden conocer a las internas, pero nunca al revés. Esto nos permite cambiar una base de datos o una librería de UI sin tener que reescribir la lógica de negocio central.

Generalmente, nos encontramos con tres bloques principales. Primero tenemos la Capa de Presentación, que es la cara visible de la app y donde se gestionan los ViewModels y la interfaz de usuario. Luego está la Capa de Dominio, que es el corazón del sistema y contiene las reglas de negocio, los modelos de entidad y los casos de uso. Por último, la Capa de Datos se encarga de la implementación concreta de los repositorios, gestionando las peticiones a APIs REST o las consultas a bases de datos locales.

Estructura y Modularización en Kotlin

Si queremos llevar esto a la práctica en un proyecto de Kotlin, no basta con crear carpetas. Para que la separación sea real, lo ideal es utilizar módulos de Gradle independientes. Esto evita que, por un descuido, importemos una clase de datos directamente en la vista, rompiendo así la regla de oro de la arquitectura.

Existen diversas formas de organizar estos módulos. Algunos optan por un enfoque simple de división por capas (un módulo para data, otro para domain y otro para presentation), pero esto puede quedarse corto en apps muy grandes. Una alternativa mucho más potente es la separación por características o features. En este modelo, cada funcionalidad de la app (por ejemplo, el perfil de usuario o el carrito de compras) tiene sus propias capas internas de dominio, datos y presentación.

Adoptar una estructura modularizada no solo pone orden, sino que dispara la productividad al conseguir tiempos de compilación más rápidos, ya que Gradle solo recompila los módulos que han sufrido cambios. Además, facilita enormemente el trabajo en equipo, permitiendo que distintos desarrolladores trabajen en features independientes sin pisarse los pies.

Anatomía detallada de las capas

Para entrar en detalle, la capa de dominio debe ser absolutamente pura. Esto significa que no debe contener ninguna referencia a Android, ni a Room, ni a Retrofit. Aquí es donde residen los Interactors o Casos de Uso, que definen exactamente qué hace la aplicación. Por ejemplo, un caso de uso llamado «ObtenerDatosUsuario» se encargaría de coordinar la lógica necesaria para traer esa información.

La capa de datos, por su parte, es la que «ensucia“ las manos. Aquí implementamos las interfaces definidas en el dominio. Es muy común utilizar el patrón Repository para abstraer el origen de los datos. El repositorio puede decidir si sirve la información desde una caché local o si tiene que hacer una petición de red, manteniendo al resto de la aplicación totalmente ignorante sobre de dónde vienen los datos.

Finalmente, la capa de presentación se encarga de gestionar el estado de la UI. Ya sea usando MVVM con Jetpack Compose o el patrón MVP, su única misión es llamar a los casos de uso y mostrar el resultado al usuario de la forma más eficiente posible. Es vital que esta capa no interactúe directamente con la base de datos, pasando siempre por el dominio.

El secreto del éxito: La Inversión de Dependencias

Muchos desarrolladores se confunden al intentar aplicar Clean Architecture porque no entienden la Inversión de Dependencias (DIP). No hay que confundirlo con la Inyección de Dependencias (DI), que es la herramienta para lograrlo. La inversión de dependencias consiste en que los módulos de alto nivel no dependan de los de bajo nivel, sino que ambos dependan de abstracciones.

Imaginemos que necesitamos guardar datos en una base de datos Room. Si la capa de datos depende directamente de la clase de Room, estamos acoplados. La solución es crear una interfaz de persistencia en el dominio. La capa de datos implementa esa interfaz y, gracias a la inyección de dependencias (usando herramientas como Koin o Hilt), el sistema le entrega al repositorio la implementación concreta en tiempo de ejecución. De este modo, si mañana decidimos cambiar Room por Realm, solo tenemos que cambiar la implementación sin tocar una sola línea de la lógica de negocio.

Consejos prácticos y buenas prácticas

Para que el proyecto no se vuelva una pesadilla de archivos repetidos, es recomendable seguir ciertas pautas. En primer lugar, evita la tentación de simplificar eliminando la capa de casos de uso en proyectos medianos; aunque parezca código redundante, es ahí donde se centraliza la lógica y se facilita el cambio de hilos de ejecución (del hilo principal al background).

Otro punto clave es la gestión de los modelos. Aunque lo ideal sería tener un modelo de datos distinto para cada capa (modelos de API, modelos de dominio y modelos de UI) y usar mappers para convertirlos, en proyectos más pequeños se puede compartir la entidad de dominio para no complicar demasiado el desarrollo. No obstante, en aplicaciones empresariales, esta separación es la que permite que el código sea realmente resistente a los cambios externos.

Implementar este sistema requiere disciplina. Es fundamental separar siempre las interfaces de sus implementaciones, colocando las interfaces en el dominio y las implementaciones en la capa de datos o framework. Solo así conseguiremos un sistema donde las piezas sean como bloques de LEGO, fáciles de quitar y poner sin que todo el edificio se venga abajo.

Tráiler de anuncio de Dragon Ball Xenoverse 3

Actualidad en 3DJuegos - Lun, 22/06/2026 - 15:10
Trailer promocional de DRAGON BALL XENOVERSE 3

En el Apple Park ya no cabe un alfiler. Apple necesita llevarse sus proyectos fuera del anillo

Actualidad en Applesfera - Lun, 22/06/2026 - 14:01

El año pasado os contamos que Apple se había gastado 882 millones de dólares en poco más de un mes comprando oficinas en Silicon Valley. Pensábamos que con eso tendría suficiente para una temporada. Pues no. Apple acaba de volver a sacar la chequera y ha comprado otro edificio de oficinas en Sunnyvale por 162 millones de dólares. El Apple Park se queda pequeño, literalmente.

Lo curioso es que este edificio ya lo tenían alquilado desde el año pasado. Apple lleva tiempo convirtiendo arrendamientos en propiedades, y esta vez encima ha hecho un buen negocio: el edificio se vendió en 2022 por 222 millones, y Apple lo ha comprado ahora por 162. Un descuento del 27% sobre el precio anterior. No está mal para una empresa que compra a precio de mercado como cualquier hijo de vecino.

{"videoId":"x8y2seu","autoplay":true,"title":"Steve Jobs Theatre", "tag":"", "duration":"59"} 162 millones por un edificio que ya tenían alquilado, y encima de oferta

El edificio está en el 684 de West Maude Avenue, en el barrio de Peery Park, a menos de un kilómetro de otros edificios que Apple ya tiene en Sunnyvale. Son cuatro plantas y casi 18.000 metros cuadrados de espacio de oficinas. Antes lo tenía alquilado LinkedIn, aunque no está claro si llegaron a mudarse. Apple firmó el subarrendamiento el año pasado y en cuanto tuvo la oportunidad lo compró.

El precio que pagó, 162 millones, queda muy por debajo de los 222 millones que costó en 2022. El mercado inmobiliario de oficinas en Silicon Valley lleva tiempo flojo, con tasas de desocupación que en algunas zonas superan el 18 o el 30 por ciento, y Apple está aprovechando ese momento para comprar a buen precio lo que ya usa o planea usar. 

Apple lleva años siguiendo el mismo patrón: alquila un edificio, lo ocupa durante un tiempo, y cuando tiene la oportunidad lo compra. En diciembre pagó 216 millones por dos edificios en Cupertino que llevaba alquilando desde 2015. En junio del año pasado compró otro grupo de edificios por 167 millones. Y antes de eso, 350 millones por el Mathilda Commons y 365 millones por el Mathilda Campus, ambos en Sunnyvale y ambos ya ocupados en su mayor parte por Apple.

Apple es una de las empresas más estables del sector, no hace despidos masivos como Microsoft o Meta, y sabe que los equipos que trabajan en esos edificios van a seguir ahí durante mucho tiempo. Si vas a pagar alquiler durante décadas, en algún momento sale más a cuenta ser el propietario. Y más cuando el mercado está a la baja y puedes comprar con descuento.

¿Para qué tanto espacio?

Apple tiene proyectos que necesitan instalaciones separadas del Apple Park, en parte por razones de seguridad y en parte porque algunos desarrollos requieren equipamiento muy especializado. Las gafas, por ejemplo, se desarrollan en una instalación de Santa Clara separada del campus principal precisamente para evitar filtraciones.

En total Apple tiene ahora mismo al menos 15 edificios en la zona de Sunnyvale, y eso sin contar el Apple Park, One Infinite Loop y el resto de instalaciones que tiene repartidas por Cupertino y Santa Clara.

882 millones gastados el año pasado, 162 millones más ahora. Apple juega al Monopoly con Silicon Valley y de momento no da señales de querer parar. Con todos los proyectos que tiene entre manos para los próximos años, probablemente necesite cada metro cuadrado que está comprando. Y con el mercado de oficinas como está, tampoco es el peor momento para hacerlo.

En Applesfera | Nuevas gafas de Apple - Todo lo que creemos saber sobre ellas

En Applesfera | Nuevos iPhone 18 Pro y 18 Pro Max - Todo lo que creemos saber sobre ellos

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

-
La noticia En el Apple Park ya no cabe un alfiler. Apple necesita llevarse sus proyectos fuera del anillo fue publicada originalmente en Applesfera por Guille Lomener .

Tráiler oficial de gameplay de Bel's Fanfare

Actualidad en 3DJuegos - Lun, 22/06/2026 - 13:57
Trailer promocional de Bel's Fanfare

Auriculares, eReaders, bases de carga MagSafe y más: los cinco mejores chollos antes del Prime Day de Amazon

Actualidad en Applesfera - Lun, 22/06/2026 - 12:31

En las próximas horas, Amazon dará comienzo a su Prime Day 2026. Pero no hace falta esperar hasta entonces para encontrar buenas ofertas, y es que la tienda ha ido ofreciendo pequeños adelantos bastante atractivos. Hay bases de carga, lectores de libros electrónicos, auriculares y mucho más.

  • Anker MagGo por 49,59 euros, una base de carga plegable que es ideal para llevarla de viaje.
  • Fire TV Stick 4K Plus por 33,99 euros, un dispositivo que permite ver Apple TV y otras plataformas en casi cualquier tele.
  • Soundcore Space Q45 por 69,99 euros, unos auriculares con una excelente relación calidad-precio.
  • Kindle Colorsoft Signature Edition (pack) por 257,97 euros, un pack que incluye el eReader, una funda y una base de carga.
  • Echo Show 11 por 154,99 euros, un altavoz con pantalla que es compatible con Alexa+.
Anker MagGo

Si ahora que se acerca el verano ya estás pensando en las vacaciones, mucho ojo al Anker MagGo. Se trata de una base de carga que destaca sobre todo porque se puede plegar, por lo que es muy cómodo de llevar en la mochila o en un bolsillo. Incorpora tres módulos para recargar un iPhone, un Apple Watch y unos AirPods y es compatible con MagSafe. Su precio es de 49,59 euros (antes 99,99 euros).

Fire TV Stick 4K Plus

Como era de suponer, Amazon ha bajado el precio de los Fire TV Stick. Hay muy buenas ofertas, pero el más destacable es el Fire TV Stick 4K Plus, sobre todo si queremos un buen precio, un buen rendimiento y compatibilidad con Dolby Vision y Dolby Atmos. Es compatible con Alexa+ y permite reproducir contenido de plataformas como Apple TV o Netflix en casi cualquier tele, siempre y cuando esta cuente con un puerto HDMI. Su precio es de 33,99 euros (antes 69,99 euros).

Soundcore Space Q45

Si quieres aprovechar el Prime Day para comprar unos buenos auriculares de diadema pero los AirPods Max 2 se te escapan de presupuesto, Amazon tiene los Soundcore Space Q45 por 69,99 euros (antes 149,99 euros). Se escuchan muy bien y son muy ligeros, pero destacan sobre todo por su cancelación de ruido y por lo cómodos que son. Los puedes llevar puestos durante horas sin sentir fatiga. Son los que utilizo yo mismo desde hace varios años y pocos le hacen frente por el precio que tienen ahora mismo.

Kindle Colorsoft Signature Edition (pack)

De momento Amazon no ha lanzado ofertas en sus lectores, pero sí que podemos encontrarlos rebajados en algunos packs. El Kindle Colorsoft Signature Edition ahora mismo cuesta 257,97 euros (antes 322,08 euros) en un pack que incluye tanto una funda protectora como una base de carga inalámbrica. La pantalla del lector es a color y tiene una diagonal de siete pulgadas, su batería tiene una autonomía de semanas y cuenta con 32 GB de almacenamiento interno.

Echo Show 11

Amazon también ha lanzado ofertas en los dispositivos Echo y el Echo Show 11 ahora mismo se encuentra a un precio de 154,99 euros (antes 239,99 euros). Se trata de un altavoz inteligente (parecido al Echo Dot), pero con una pantalla integrada de 11 pulgadas. Permite ver información relativa al tiempo, reproducir música o ver contenido en plataformas de streaming.

En Applesfera Qué AirPods comprar en 2026: los mejores auriculares de Apple y cuál elegir según tus necesidades

Algunos de los enlaces de este artículo son afiliados y pueden reportar un beneficio económico a Applesfera. En caso de no disponibilidad, las ofertas pueden variar.

Imágenes | Amazon, Anker

En Applesfera | Qué iPhone comprar. Guía para elegir el smartphone de Apple más adecuado para ti

En Applesfera | Mejores accesorios Magsafe para tu iPhone

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

-
La noticia Auriculares, eReaders, bases de carga MagSafe y más: los cinco mejores chollos antes del Prime Day de Amazon fue publicada originalmente en Applesfera por Alberto García .

Que watchOS 27 deje fuera a cinco Apple Watch ya tiene una explicación oficial. Otra cosa es que nos convenza

Actualidad en Applesfera - Lun, 22/06/2026 - 12:01

Cuando se anunció watchOS 27 se vivió un pequeño drama al ver que ni siquiera un Apple Watch Series 9 lanzado hace menos de tres años era compatible. Aquello fue un error de Apple y enseguida supimos la auténtica compatibilidad de watchOS 27, aunque seguía dejando fuera a varias generaciones.

Ahora, en declaraciones a TechRadar, varios portavoces de Apple han explicado a fondo el por qué de la incompatibilidad con cinco modelos de Apple Watch que sí soportaron watchOS 26. Tras leerla, vemos que tiene sentido la explicación, aunque es algo incoherente si miramos a iOS 27.

Hardware, el motivo de la limitación de software El primer Apple Watch Ultra, que aún no ha cumplido cuatro años, se queda fuera de watchOS 27

Hay cinco modelos que no tendrán watchOS 27: Apple Watch Series 6Series 7Series 8, Ultra 1 y SE (2ª gen.). Cualquier otro posterior a ellos sí lo recibirá y con ello una serie de novedades que, a falta de ver si llegan a Europa, parecen requerir un determinado hardware. Y es eso lo que explican en Apple.

David Clark, director senior de ingeniería de software en watchOS, explicó a TechRadar que uno de los objetivos de watchOS 27 era convertir al Apple Watch en un auténtico compañero de IA con Apple Intelligence.

Según el ejecutivo, el reloj es muchas veces "la forma más conveniente de interactuar con Siri", por lo que querían que la experiencia fuese consistente entre el iPhone y la muñeca, con acceso a la misma información de la nueva Siri AI independientemente del dispositivo desde el que se invoque al asistente.

En Applesfera iOS 26.5 prometía mejorar su compatibilidad con relojes que no fuesen de Apple. Lo he probado y hay buenas noticias

Cait Dooley, responsable de marketing del Apple Watch y el área de Salud de Apple, fue quien explicó que la compañía prioriza siempre el rendimiento y que las nuevas funciones ofrezcan la mejor experiencia. Y dicen que eso se podía lograr solo en dispositivos más recientes como los que finalmente han sido compatibles con watchOS 27.

Aunque Apple no ha detallado oficialmente los los requisitos técnicos, la línea de corte coincide con la llegada del chip S9 y un mayor almacenamiento interno en el reloj. Modelos como el Series 8 o el Ultra original utilizan el chip S8, mientras que el S9 incorporó un Neural Engine más potente orientado a tareas de aprendizaje automático, mientras que también disponen de 64 GB de espacio para instalar los modelos que se ejecutan en local.

El por qué no acaba de ser una excusa convincente El iPhone 11 debería ser un perfecto ejemplo para los Apple Watch antiguos que no recibirán watchOS 27

¿Tiene razón Apple en ser tan restrictiva con las grandes novedades de watchOS 27? Creo que sí. El enfoque de la compañía en que muchos de los modelos de IA se ejecuten en local hacen que, muy a pesar de quienes tenemos Watch anteriores, solamente se pueda ejecutar en los más potentes.

El verdadero problema de todo esto está en que habrá muchos Apple Watch que se queden en una versión "inestable" como es watchOS 26. Y uso comillas porque hace casi un año que se lanzó oficialmente, que vamos ya por watchOS 26.5 y no es ninguna beta, sino que es una versión final.

Sin embargo, como ha sucedido también en iOS 26 y macOS 26 Tahoe, watchOS 26 ha sido una versión plagada de problemas: alto consumo de batería, apps que no funcionan como deberían... Y todo ello sigue sucediendo, aunque en menor medida, en watchOS 26.5, que es la última que se ha lanzado.

En iOS 27 sí encontramos dispositivos antiguos sin grandes novedades, pero sí con las mejoras de rendimiento

En watchOS 27 se centrarán también en pulir esos problemas, razón por la que personalmente me cuesta entender que no llegue a todos los relojes. Sobre todo por que ya tenemos el ejemplo perfecto en los iPhone. Más en concreto en los iPhone 11.

Estos dispositivos no tienen capacidades para tener la nueva IA de Apple y por tanto no la tendrán. Sin embargo, sí que actualizarán para recibir otras novedades como las citadas mejoras en rendimiento. Y creo que es justo lo que se podía haber hecho con los Apple Watch Series 6 y compañía, en lugar de dejarlos anclados en watchOS 26.

La vida que les queda a los relojes que no llegan a watchOS 27 {"videoId":"xaelf7u","autoplay":true,"title":"iOS 27 Las funciones que realmente usarás", "tag":"webedia-prod", "duration":"395"}

Pese a que vayamos a tener cinco modelos que no se actualicen, en esas mismas declaraciones a TechRadar, Apple confirma que seguirá habiendo actualizaciones para ellos. No serán de watchOS 27, pero sí actualizaciones intermedias de watchOS 26.

En Applesfera El nuevo CEO de Apple se ha marcado como prioridad lo que Tim Cook había dejado en el cajón: el diseño

No es ninguna sorpresa esto sabiendo que, de forma muy acertada, Apple sigue actualizando dispositivos que quedaron obsoletos hace ya años. Lo hacen por motivos de seguridad, ya que suelen añadir parches importantes cuando así se requiere.

Es aquí donde entra un atisbo de esperanza para quienes tenemos relojes que no recibirán watchOS 27. Es posible que en watchOS 26.6 (ya en beta) se corrijan de una vez por todas los problemas de rendimiento encontrados hasta la fecha y en los que incluso apps nativas como Recordatorios tienen algún fallo. Aunque sin duda, no serán arreglos con el mismo nivel de profundidad que en watchOS 27.

En Applesfera | Nuevo Apple Watch Series 12 - Todo lo que creemos saber sobre él

En Applesfera | Nuevos iPhone 18 Pro y 18 Pro Max - Todo lo que creemos saber sobre ellos

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

-
La noticia Que watchOS 27 deje fuera a cinco Apple Watch ya tiene una explicación oficial. Otra cosa es que nos convenza fue publicada originalmente en Applesfera por Álvaro García M. .

La última filtración le pone precio al iPhone 18 Pro y cruzamos los dedos para que esta vez no acierten

Actualidad en Applesfera - Lun, 22/06/2026 - 10:35

La crisis de memorias y sus consecuencias para Apple está entrando en su época más difícil. Tim Cook lo confirmó, Gurman avisó de que las subidas llegarían antes de otoño, y nosotros ya os contamos qué comprar ahora y qué esperar. Pues bien, ahora hay un número encima de la mesa, y cuesta creerlo: 1.399 dólares de salida para el iPhone 18 Pro, lo que en euros podría traducirse en unos 1.500 euros para el iPhone 18 Pro y cerca de 1.700 euros para el iPhone 18 Pro Max.

Me niego a creérmelo del todo, y no lo digo por optimismo mal entendido sino porque la historia de Apple con los precios nos ha enseñado varias veces que los números que circulan antes de septiembre suelen ser peores de lo que termina pasando. Pasó con los aranceles, cuando todos los medios hablaban de iPhone a 2.000 dólares y al final el iPhone 17 mantuvo el precio. Que esta vez la situación sea diferente no significa que el resultado final tenga que ser tan extremo.

{"videoId":"x9xr9ly","autoplay":true,"title":"CRISIS de la RAM- PRECIOS un 300% más ALTOS en el componente que está en TODOS tus dispositivos", "tag":"memoria ram", "duration":"348"} El Wall Street Journal pone cifras encima de la mesa

El análisis parte de los costes de fabricación. La memoria DRAM que Apple pagó unos 39 dólares en el iPhone 17 Pro podría costar hasta 145 dólares en el iPhone 18 Pro. El almacenamiento flash de 256 GB, que salía por unos 13 dólares, podría subir hasta 51. En total, los costes de fabricación del iPhone 18 Pro subirían un 25% respecto al iPhone 17 Pro, llegando a unos 726 dólares por unidad.

Para mantener el margen de beneficio habitual de alrededor del 47%, Apple tendría que cobrar 1.371 dólares. Pero como Apple prefiere precios redondos y psicológicamente manejables, el análisis apunta a 1.299 dólares como escenario más probable, con un margen algo más ajustado del 44%. Y si encima sumamos el nuevo sistema de cámara, que según las filtraciones costará a Apple un 50% más que el de la generación anterior, el precio podría escalar hasta esos 1.399 dólares o más.

Aumento del precio de un módulo de 16GB de RAM Apple casi nunca sube tanto como dicen los rumores

Aquí es donde conviene poner un poco de perspectiva. Apple lleva años gestionando sus precios de una forma muy particular, y raramente hace subidas tan agresivas como las que se predicen antes de septiembre. Con los aranceles de Trump se auguraba iPhone a 2.000 dólares y el iPhone 17 mantuvo el precio. 

Con el iPhone 17 Pro utilizaron un truco: desapareció la versión de 128 GB y el modelo base pasó a ofrecer 256 GB, lo que técnicamente no era una subida de precio pero sí encarecía el acceso al modelo más económico.

Con los Mac ya hemos visto algo parecido. El Mac mini dejó de venderse en su configuración de 256 GB y el precio de entrada subió de golpe. No es que Apple subiera el precio, es que eliminó el modelo más barato. Y eso puede pasar perfectamente con el iPhone 18 Pro.

Las jugadas que puede hacer Apple para no parecer el malo

Hay varias formas en las que Apple puede gestionar esto sin que el titular sea "Apple sube el iPhone 200 euros". La más probable, siguiendo el patrón reciente, es que:

  • El iPhone 18 Pro desaparezca en su versión de 256 GB y pase a ofrecer solo 512 GB como configuración base. 
  • El iPhone 17 Pro de 512 GB cuesta actualmente 1.569 euros, y el Pro Max de 512 GB sale a 1.719 euros.
  • Esos números coinciden bastante con las proyecciones del análisis (traducido a euros).
  • Aunque es una barbaridad de precio, al menos "nos llevamos algo a cambio".

La otra jugada es simplemente subir el precio base de forma moderada, unos 100 euros en España como pasó con el iPhone 14 Pro por la diferencia euro dólar, y negociar con los proveedores para absorber parte del coste extra. 

Modelo

Almacenamiento

Precio EE.UU.

Precio ESPAñA

iphone 6

16 GB

649 dólares

699 euros

iphone 6s

16 GB

649 dólares

749 euros

iphone 7

32 GB

649 dólares

769 euros

iphone 8

64 GB

699 dólares

809 euros

iphone x

64 GB

999 dólares

1.159 euros

iphone xs

64 GB

999 dólares

1.159 euros

iphone 11 pro

64 GB

999 dólares

1.159 euros

iphone 12 pro

128 GB

999 dólares

1.159 euros

iphone 13 pro

128 GB

999 dólares

1.159 euros

iphone 14 pro

128 GB

999 dólares

1.319 euros

iphone 15 pro

128 GB

999 dólares

1.219 euros

iphone 16 pro

128 GB

999 dólares

1.219 euros

iPhone 17 Pro

256 GB

1.099 dólares

1.319 euros

iPhone 18 Pro (estimación 1)

256 GB

1.199 dólares

1.419 euros

iPhone 18 Pro (estimación 2)

512 GB

1.299 dólares

1.569 euros

Apple compra a un volumen que le da mucho margen de negociación, y no va a repercutir el 100% de la subida al consumidor porque sabe que hay un límite a partir del cual la gente empieza a mirar a otras marcas o a no renovar sus modelos.

Lo que sí parece claro es que algo va a subir. Los rumores de principios de año decían que Apple mantendría precios, y esos rumores los daban fuentes que parecían fiables. Pero las declaraciones públicas de Tim Cook pesan más que cualquier filtración, y Tim ha dicho que vienen subidas. La pregunta ya no es si suben sino cuánto, y la respuesta está en Cupertino guardada hasta septiembre.

Hasta entonces todo son proyecciones, y la experiencia nos dice que Apple suele encontrar la forma de que el golpe no sea tan brutal como parecía en los análisis previos. Ojalá esta vez no sea la excepción.

Fuente | The Wall Street Journal

En Applesfera | Nuevos iPhone 18 Pro y 18 Pro Max - Todo lo que creemos saber sobre ellos

En Applesfera | Qué iPhone comprar en 2026 - Guía para elegir el smartphone de Apple más adecuado para ti

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

-
La noticia La última filtración le pone precio al iPhone 18 Pro y cruzamos los dedos para que esta vez no acierten fue publicada originalmente en Applesfera por Guille Lomener .

Guía Completa de Animaciones Fluidas en Jetpack Compose con AnimatedVisibility

Actualidad en Androidsis - Lun, 22/06/2026 - 00:03

A ver, si te dedicas al desarrollo de Android, ya sabrás que una aplicación que se siente «estática» es una aplicación que no engancha. Las animaciones no son solo adornos para que la app se vea bonita; son la herramienta clave para que el usuario entienda qué está pasando en la pantalla, ya sea que un dato se esté cargando o que una ventana se despliegue. Con la llegada de <strongdalam=»Jetpack Compose»>Jetpack Compose, hemos pasado de pelearnos con archivos XML complicados a un modelo declarativo donde decirle a la interfaz cómo moverse es mucho más intuitivo.

Lo cierto es que Compose nos ofrece un abanico de opciones tan amplio que, al principio, uno puede sentirse un poco perdido sobre qué herramienta sacar del cajón. Desde cosas sencillas que se hacen casi solas hasta controles de bajo nivel para los que queremos pixelar cada movimiento, hay una API para cada necesidad. En este artículo vamos a desgranar <strongdalam=»todos los mecanismos de animación»>todos los mecanismos de animación, desde el famoso AnimatedVisibility hasta la gestión de rendimiento, para que tus interfaces fluyan como la seda.

Dominando la Aparición y Desaparición con AnimatedVisibility

Cuando queremos que un elemento aparezca o se vaya de la pantalla, la opción más directa es <strongdalam=»AnimatedVisibility»>AnimatedVisibility. Lo bueno de este componente es que no se limita a cambiar la opacidad, sino que gestiona la composición: cuando el elemento es invisible, Compose <strongdalam=»lo retira totalmente del árbol de nodos»>lo retira totalmente del árbol de nodos, lo cual es genial para la accesibilidad y el rendimiento. Si quieres darle un toque más profesional, puedes combinar efectos usando el operador <codedalam=»+»>+, mezclando por ejemplo un <codedalam=»fadeIn()»>fadeIn() con un <codedalam=»slideInVertically()»>slideInVertically() para que el contenido no solo aparezca, sino que se deslice suavemente.

Ahora bien, existe una alternativa si solo buscas un efecto de transparencia: <strongdalam=»animateFloatAsState»>animateFloatAsState aplicado al alfa. La diferencia crucial es que, con este método, el elemento <strongdalam=»sigue ocupando espacio»>sigue ocupando espacio en el diseño aunque no se vea, lo que puede dar problemas con los lectores de pantalla. Por eso, si el objetivo es que el componente desaparezca de verdad, AnimatedVisibility es la elección ganadora.

Animaciones Basadas en Estado: La Magia de animate*AsState

Para aquellos cambios de valores simples, Compose nos regala una familia de funciones muy cómodas. Si necesitas cambiar un color, un tamaño o una posición, tienes <strongdalam=»animateColorAsState, animateDpAsState o animateFloatAsState»>animateColorAsState, animateDpAsState o animateFloatAsState. Estas funciones son ideales porque mantienen el estado durante la recomposición, haciendo que la transición entre el valor A y el valor B sea fluida sin que tengas que programar cada frame manualmente.

Un punto donde mucha gente mete la pata es en la animación de colores de fondo. En lugar de usar <codedalam=»Modifier.background()»>Modifier.background(), que puede provocar demasiadas recomposiciones, es mucho más eficiente emplear <strongdalam=»Modifier.drawBehind»>Modifier.drawBehind. Al dibujar el color directamente en la fase de dibujo, la app respira mejor y el rendimiento sube notablemente. Además, para ajustar la velocidad y el «feeling» de estas animaciones, disponemos de <strongdalam=»animationSpec»>animationSpec, donde podemos elegir entre un <codedalam=»spring»>spring (estilo muelle, más natural) o un <codedalam=»tween»>tween (duración fija con una curva de aceleración).

Coordinación Avanzada: updateTransition y Animatable

A veces no basta con animar una sola cosa. Imagina que quieres que un botón cambie de tamaño, rote 45 grados y cambie de color, todo a la vez y sincronizado. Para esto existe <strongdalam=»updateTransition»>updateTransition. El truco aquí es definir un estado (normalmente un Enum) y dejar que la transición gestione todas las propiedades dependientes. Así, todas las animaciones <strongdalam=»están perfectamente coordinadas»>están perfectamente coordinadas y no se desfasan entre sí.

Si lo que buscas es un control absoluto, casi quirúrgico, tienes que irte a <strongdalam=»Animatable»>Animatable. Esta es la API de bajo nivel. A diferencia de las anteriores, Animatable te permite <strongdalam=»interrumpir la animación»>interrumpir la animación, invertirla o cambiar el objetivo en tiempo real mediante funciones de suspensión como <codedalam=»animateTo()»>animateTo() o <codedalam=»snapTo()»>snapTo(). Es la herramienta perfecta para gestos complejos donde el usuario puede detener el movimiento con el dedo.

Transiciones de Contenido y Navegación

Cuando el cambio no es solo de una propiedad, sino de un componente entero por otro, entra en juego <strongdalam=»AnimatedContent»>AnimatedContent. Es ideal para cambiar entre pantallas de carga y pantallas de datos. Podemos personalizar la <codedalam=»transitionSpec»>transitionSpec para definir exactamente cómo sale el contenido antiguo y cómo entra el nuevo. Para los que usan <strongdalam=»navigation-compose»>navigation-compose, ya es posible integrar estas transiciones directamente en el NavHost mediante <codedalam=»enterTransition»>enterTransition y <codedalam=»exitTransition»>exitTransition, logrando que el salto entre destinos sea elegante y no un corte brusco.

Efectos Continuos y Animaciones de Texto

Para aquellos elementos que nunca dejan de moverse, como un spinner de carga o un efecto de pulsación, <strongdalam=»rememberInfiniteTransition»>rememberInfiniteTransition es la solución. Permite crear bucles infinitos usando <codedalam=»infiniteRepeatable»>infiniteRepeatable, donde puedes decidir si la animación debe ir y volver (Reverse) o simplemente reiniciar desde el principio. En el caso del texto, hay un detalle vital: para que las transformaciones de escala o rotación se vean fluidas, debemos configurar el parámetro <strongdalam=»textMotion como TextMotion.Animated»>textMotion como TextMotion.Animated dentro del estilo del texto.

El Rincón del Rendimiento: Evitando el Lag

Animar píxeles rápidamente puede consumir muchos recursos si no se hace con cabeza. La regla de oro en Compose es: <strongdalam=»evita la fase de recomposición»>evita la fase de recomposición siempre que puedas. Si animas un valor que cambia el layout, Compose tiene que volver a calcular el tamaño de todo, lo cual es costoso. La solución es delegar el trabajo a la fase de dibujo utilizando <strongdalam=»Modifier.graphicsLayer»>Modifier.graphicsLayer.

Al usar <codedalam=»graphicsLayer»>graphicsLayer para propiedades como la escala, rotación o alfa, estamos moviendo el trabajo a la GPU, saltándonos la recomposición y el rediseño. Asimismo, es muy recomendable usar <strongdalam=»las versiones lambda de los modificadores»>las versiones lambda de los modificadores, ya que permiten que la lectura del estado animado ocurra lo más tarde posible en el ciclo de renderizado, manteniendo así los 60 FPS incluso en dispositivos menos potentes.

Mirando al Pasado: El Enfoque Legacy

Aunque Compose es el presente, es bueno recordar que antes dependíamos de <strongdalam=»ObjectAnimator y archivos XML»>ObjectAnimator y archivos XML en la carpeta <codedalam=»res/anim»>res/anim. Aquellos sistemas se basaban en <codedalam=»PropertyValuesHolder»>PropertyValuesHolder para alterar la opacidad (ALPHA), la rotación o la traslación. Aunque eran potentes, requerían mucho más código repetitivo y la gestión de los listeners para saber cuándo terminaba una animación era bastante más tediosa que el sistema actual de corrutinas y estados de Compose.

Tener un dominio sólido de las APIs de animación, desde la sencillez de AnimatedVisibility hasta la potencia de Animatable, permite transformar una interfaz plana en una experiencia vibrante. La clave reside en elegir la herramienta adecuada según la complejidad del efecto y priorizar siempre el uso de graphicsLayer para que el rendimiento no se vea comprometido, asegurando que el usuario perciba una aplicación profesional, fluida y agradable al tacto. Comparte esta guía y más usuarios conocerán los trucos.

Sé que todos hablan de Siri AI, pero la "otra IA" que Apple trae en iOS 27 y macOS 27 es brutal

Actualidad en Applesfera - Sáb, 20/06/2026 - 11:00

Casi dos semanas después de la WWDC26, empiezo a dejar de lado el disgusto de que Siri AI no llegue a Europa de momento. Esto me está permitiendo observar mejor las otras novedades de inteligencia artificial que sí llegarán a nuestro país. Y las de Safari y Contraseñas de Apple son dos de las más interesantes.

En iOS 27iPadOS 27  y macOS 27 Golden Gate nos encontraremos con varios modelos de IAs agénticas. De esas que trabajan en segundo plano por ti para ahorrarte trabajo. Y aunque aún están en pañales, son de las funciones con más potencial de los nuevos sistemas. Al menos de lo que nos llegará a Europa.

Índice de Contenidos (4) La mala noticia: solo para Apple Intelligence {"videoId":"xaelf7u","autoplay":true,"title":"iOS 27 Las funciones que realmente usarás", "tag":"webedia-prod", "duration":"395"}

Solo los dispositivos que tengan compatibilidad con Apple Intelligence podrán acceder a las funciones de IA que vamos a comentar. Así que si no se tiene uno de ellos, aunque el software esté actualizado a esas versiones, no lo tendrán.

MODELOS COMPATIBLES

IPHONE

  • iPhone 15 Pro / iPhone 15 Pro Max
  • iPhone 16e / iPhone 16 / iPhone 16 Plus / iPhone 16 Pro / iPhone 16 Pro Max
  • iPhone 17e / iPhone 17 / iPhone 17 Pro / iPhone 17 Pro Max
  • iPhone Air

IPAD

  • iPad mini (A17 Pro - 2024)
  • iPad Air (M1) / iPad Air (M2) / iPad Air (M3) / iPad Air (M4)
  • iPad Pro (M1) / iPad Pro (M2) / iPad Pro (M4) / iPad Pro (M5)

MAC

  • iMac (M1) / iMac (M3) / iMac (M4)
  • Mac mini (M1) / Mac mini (M2/M2 Pro) / Mac mini (M4/M4 Pro)
  • Mac Studio (M1 Max/M1 Ultra) / Mac Studio (M2 Max/M2 Ultra) / Mac Studio (M4 Max) / Mac Studio (M3 Ultra) 
  • Mac Pro (M2 Ultra)
  • MacBook Neo (A18 Pro)
  • MacBook Air (M1) / MacBook Air (M2) / MacBook Air (M3) / MacBook Air (M4) / MacBook Air (M5)
  • MacBook Pro (M1/M1 Pro/M1 Max) / MacBook Pro (M2/M2 Pro/M2 Max) / MacBook Pro (M3/M3 Pro/M3 Max) / MacBook Pro (M4/M4 Pro/M4 Max) / MacBook Pro (M5/M5 Pro/M5 Max)
Un solo botón para cambiar todas las contraseñas

La primera función de IA agéntica que destaca en los nuevos sistemas operativos es la capacidad de la app Contraseñas de Apple para que baste con tocar un botón para que se cambien todas nuestras contraseñas vulnerables. Y sí, sin tener que ir una por una a cada web y app para cambiarlas.

Desde que llegó en iOS 18, esta aplicación tiene la capacidad de escanear si nuestras contraseñas son vulnerables en virtud de si han aparecido en alguna filtración de datos, si detecta que es muy sencilla o si hace mucho tiempo que no las cambiamos.

En Applesfera El 60% de las contraseñas se revientan en menos de una hora. La solución ya viene instalada de serie en el iPhone

La diferencia ahora es que también aparece una nueva función de seguridad que servirá para cambiar una, varias o todas esas contraseñas vulnerables. Una IA lo hará en segundo plano sin que tengas que entrar en sus respectivos sitios web y generará una nueva contraseña aleatoria y segura que se quedará guardada en la propia app para que sepas cuál es.

Eso sí, hay que advertir que no todos los sitios web admiten esta funcionalidad, ya que deben tener una API que lo permita. Por suerte, cuentas de Google y otras plataformas importantes ya lo admiten.

Safari te notifica cuando algo cambia

Estás esperando para que vuelva a haber stock de un producto de una tienda online o si este baja de precio. O puede que simplemente quieras ver cuándo se publica un nuevo artículo en Applesfera. Hay muchas situaciones en las que sí o sí tendrás que estar pendiente de una web e ir refrescándola para ver los cambios.

Contra eso "peleará" Safari en el nuevo sistema operativo de Apple , ya que hay una nueva función llamada Notify me y que en castellano se ha traducido como Notificarme (en macOS 27) y Recibir notificaciones (en iOS 27 y iPadOS 27).

Una nueva IA agéntica de Apple hará esa labor de espera por ti. Estará en segundo plano refrescando una página web a la espera de que aparezcan cambios que te interesen y, cuando se producen, te avisan.

Esta función está dentro de las opciones de lectura de Safari y al acceder a ella se debe describir qué es lo que queremos que nos notifique. Ahí se puede usar lenguaje natural para explicar lo que queremos que nos notifique. 

En la parte de abajo se puede elegir la frecuencia con la que queremos que Safari busque cambios. Por desgracia no es posible hacer que esté pendiente de forma continua, aunque sí se puede elegir que lo haga cada día, cada semana o cada semana en días alternos.

Cabe señalar que podrás tener la app de Safari cerrada porque el escaneo será en segundo plano. Lo único necesario es que tengas el Mac, iPhone o iPad encendido si quieres que te llegue la notificación.

Extensiones personalizadas de Safari

Las extensiones llevan años siendo uno de los puntos débiles de Safari frente a navegadores como Chrome. Apple ha intentado reducir esa distancia con una nueva función que nos permitirá crear una extensión basándose en una descripción. Una que, como con las notificaciones, podremos escribir con lenguaje natural.

La idea es interesante porque elimina una de las mayores barreras de entrada para los usuarios. Hasta ahora había que buscar una extensión ya creada por un desarrollador, instalarla y esperar que siguiese recibiendo soporte. Con esta nueva función, cada usuario podrá crear pequeñas herramientas adaptadas exactamente a sus necesidades. Apple mostró el ejemplo de una extensión para guardar y puntuar recetas, pero las posibilidades parecen mucho más amplias.

En Applesfera El primer susto con macOS 27: una app incompatible y cómo prepararte para lo que viene

Lo mejor es que no hace falta saber programar. Safari interpreta la descripción, genera la extensión y la añade directamente al navegador. Y todo a través del mismo botón de opciones de lectura donde ya encontrábamos las opciones de notificaciones.

Una vez que se crea, se guarda como cualquier otra extensión de Safari y puede activarse, desactivarse o eliminarse desde los ajustes del navegador. Además, Apple asegura que el código generado puede revisarse antes de instalarlo, así que así podremos comprobar la transparencia y seguridad para el usuario.

En Applesfera | Apple macOS: todas las versiones hasta la fecha, cómo saber la que estás usando y cómo actualizar el sistema operativo

En Applesfera | ¿Cuántos años de actualizaciones le quedan a mi iPhone? Así podemos saberlo

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

-
La noticia Sé que todos hablan de Siri AI, pero la "otra IA" que Apple trae en iOS 27 y macOS 27 es brutal fue publicada originalmente en Applesfera por Álvaro García M. .

Guía Completa sobre la Creación de Modificadores Personalizados

Actualidad en Androidsis - Vie, 19/06/2026 - 23:20

Cuando nos metemos en el mundo del desarrollo y el diseño técnico, nos damos cuenta de que las herramientas estándar a veces se quedan cortas. Es ahí donde entra en juego la creación de modificadores personalizados, una funcionalidad que nos permite adaptar el comportamiento de un elemento, ya sea una pieza de software, un objeto físico en 3D o un producto en un catálogo de ventas, exactamente a nuestro antojo.

No importa si estás peleándote con el código de una app o ajustando la rigidez de una pieza impresa; saber cómo extender las capacidades base es lo que diferencia a un usuario promedio de un auténtico experto. En este artículo vamos a desgranar todas las formas de implementar estas personalizaciones desde cero, analizando diferentes entornos técnicos.

Desarrollo de Modificadores en Jetpack Compose

En el ecosistema de Compose, los modificadores son la clave para alterar la interfaz de usuario. Aunque ya vienen muchos de serie, a veces necesitamos crear nuestra propia lógica. Básicamente, un modificador se divide en una fábrica (que es la función de extensión que usamos para encadenar elementos) y el elemento modificador en sí, donde ocurre la magia del comportamiento.

Si buscas algo sencillo, la mejor opción es encadenar modificadores existentes. Por ejemplo, si siempre usas el mismo relleno y color, puedes agruparlos en una sola función para no repetir código. Ahora bien, si necesitas algo más dinámico, puedes usar una fábrica de modificadores componible. Esto te permite aprovechar APIs de animación como animate*AsState, aunque hay que tener cuidado: estas funciones se ejecutan en cada recomposición, lo que puede afectar al rendimiento si no se gestionan bien.

Para los que buscan la máxima eficiencia, la API de nivel inferior es Modifier.Node. Es la forma más potente y es la que usa el propio equipo de Google. Para implementarlo, necesitas tres piezas: la lógica en el nodo (como DrawModifierNode para dibujar), un ModifierNodeElement que gestione la creación y actualización del nodo, y la fábrica pública. El truco aquí es que los nodos pueden mantener el estado entre recomposiciones, evitando cálculos innecesarios.

Dentro de Modifier.Node, existen situaciones avanzadas. Por ejemplo, si quieres leer valores de CompositionLocal, debes usar currentValueOf dentro de un ámbito específico para que el nodo reaccione a los cambios. Además, puedes optimizar la invalidación desactivando la automática mediante shouldAutoInvalidate = false, lo que permite que solo se redibuje la pantalla cuando cambie el color y no cuando cambie la posición, ahorrando recursos del sistema.

Personalización en la Impresión 3D y Modelado

En el ámbito del 3D, los modificadores no son código, sino volúmenes de control que permiten cambiar la configuración de una zona específica del modelo sin afectar al resto. Esto es vital para ahorrar material y tiempo de impresión.

  • Modificador de Rango de Altura: Permite establecer intervalos verticales donde, por ejemplo, se puede aumentar la densidad del relleno o cambiar el número de perímetros para dar más rigidez a una base.
  • Mallas Modificadoras: Se basan en la intersección de una forma geométrica (cubo, esfera, cilindro) con el modelo. Si quieres que solo una esquina de tu pieza tenga propiedades de material distintas, colocas una malla modificadora justo ahí.

Estas herramientas cuentan con modos de ajuste. El modo avanzado se centra en capas y rellenos, mientras que el modo experto permite tocar parámetros críticos como la velocidad de extrusión o el ancho de la línea, permitiendo una precisión industrial en la pieza final.

Gestión de Modificadores en Puntos de Venta (POS)

Llevando esto al mundo comercial, como en Square, los modificadores son opciones que el cliente elige al comprar, como añadir extra de queso a una hamburguesa. A diferencia de las variantes (que definen el tamaño), los modificadores son complementos dinámicos.

El proceso consiste en crear un conjunto de modificadores y asignarlo a los artículos correspondientes. Es fundamental configurar los canales de venta, ya que si un modificador no está asignado al canal donde se vende el producto, el cliente no lo verá. Además, se puede anular la configuración general a nivel de artículo individual para establecer reglas de cantidad o visibilidad específicas, permitiendo una gestión del inventario mucho más flexible.

Modificadores de Propiedades en Tekla Structures

Finalmente, en la ingeniería estructural, existen los modificadores de propiedad para componentes personalizados. Aquí se utilizan variables paramétricas para definir la clase y el tamaño de barras de armadura.

Para lograrlo, se crean variables en el editor de componentes y se enlazan mediante ecuaciones a las propiedades del modificador. Por ejemplo, se puede definir que si una variable es 0, se mantenga la clase original de la armadura. Esto permite que el usuario final pueda ajustar el diámetro de las barras desde un cuadro de diálogo sin tener que entrar en la edición profunda del modelo, agilizando enormemente el flujo de trabajo técnico.

Ya sea optimizando el renderizado de una aplicación móvil, ajustando la resistencia de una pieza plástica, personalizando un menú de restaurante o parametrizando estructuras de acero, el dominio de los modificadores permite pasar de soluciones genéricas a herramientas precisas y adaptadas a cada necesidad específica del proyecto. Comparte esta guía y más usuarios conocerán del tema.

Guía Maestra de Tipografías y Estilizado Avanzado de Texto en Jetpack Compose

Actualidad en Androidsis - Vie, 19/06/2026 - 23:20

Cuando nos ponemos manos a la obra con el diseño de interfaces en Android, el texto es probablemente el elemento más recurrente. No se trata solo de soltar un string en la pantalla, sino de cómo hacemos que ese contenido tenga personalidad y guíe al usuario a través de la jerarquía visual de la aplicación.

Jetpack Compose ha venido a simplificarnos la vida, sustituyendo el antiguo TextView por el componente Text. Aunque a simple vista parece sencillo, tiene una profundidad increíble que nos permite desde aplicar un simple color hasta crear efectos de marquesina o integrar fuentes que se descargan sobre la marcha.

Para empezar, el parámetro fontFamily es nuestra herramienta clave. Por defecto, Compose nos ofrece las clásicas serif, sans-serif, monoespaciadas y cursivas. Pero claro, si queremos que la app tenga un toque único, necesitamos fuentes personalizadas alojadas en la carpeta res/font. Para ello, definimos un objeto FontFamily donde asociamos cada archivo .ttf con su peso correspondiente, como FontWeight.Bold o FontWeight.Light.

Si no quieres cargar la app de archivos pesados, la API de fuentes descargables de Google es la solución ideal. A partir de la versión 1.2.0, podemos configurar un GoogleFont.Provider con las credenciales necesarias y cargar la fuente de forma asíncrona. Un truco vital aquí es establecer fuentes de resguardo (fallback); así, si la descarga falla por falta de conexión, el sistema utilizará una fuente local para que la interfaz no se rompa.

Configuración de Tipografías y Familias de Fuentes

Aquí es donde la cosa se pone interesante. Las fuentes variables son archivos únicos que permiten ajustar ejes de diseño como el peso, la inclinación o el ancho sin necesidad de tener diez archivos diferentes. Esto solo es compatible con Android O en adelante, por lo que es obligatorio implementar una comprobación de la versión del SDK para ofrecer una fuente estática a los dispositivos más antiguos.

Lo más potente es que podemos manipular ejes personalizados. Por ejemplo, en fuentes como Roboto Flex, podemos alterar el ascenderHeight (la altura de las letras minúsculas) o el counterWidth mediante FontVariation.Settings. Esto nos permite un ajuste quirúrgico de la tipografía según el espacio disponible o la intención comunicativa.

El Poder de las Fuentes Variables

Más allá de la fuente, el componente Text nos permite jugar con el fontSize (usando sp o dp), el letterSpacing para airear el texto y el lineHeight para mejorar la legibilidad de párrafos largos. Si queremos que el texto se corte con elegancia, combinamos maxLines con TextOverflow.Ellipsis, lo que añade los típicos puntos suspensivos al final de la frase cuando el contenido no cabe.

Para llevar la estética al extremo, tenemos la API de Brush. En lugar de un color sólido, podemos aplicar un linearGradient para que el texto tenga un degradado de colores. Esto se puede aplicar a todo el texto o solo a una parte usando SpanStyle. Además, si necesitamos que un texto largo se desplace automáticamente, el modificador basicMarquee() crea ese efecto de cinta animada tan útil en notificaciones o títulos extensos.

A veces necesitamos que una sola línea tenga palabras en negrita, otras en azul y algunas en cursiva. Para esto existe AnnotatedString. Usando el constructor buildAnnotatedString, podemos intercalar diferentes estilos mediante bloques withStyle, permitiendo que cada segmento de la frase tenga su propia identidad visual.

Estilizado Detallado y Efectos Visuales

Otra funcionalidad muy potente es la capacidad de renderizar HTML con vínculos mediante AnnotatedString.fromHtml(). Esto convierte etiquetas básicas de HTML en texto estilizado de Compose, permitiendo que los enlaces sean clicables y tengan un aspecto personalizado gracias a TextLinkStyles, lo que facilita enormemente la presentación de textos legales o informativos.

Para no ir definiendo estilos en cada pantalla, lo ideal es centralizar todo en el archivo Type.kt. Aquí definimos un objeto Typography que mapea los roles de Material Design 3 (como displayLarge, headlineMedium o bodySmall) a nuestros TextStyle personalizados. Al pasar este objeto al MaterialTheme, podemos invocar cualquier estilo simplemente llamando a MaterialTheme.typography.h6.

Si en algún momento un texto específico necesita un pequeño ajuste sobre el estilo global, no hace falta redefinirlo todo; basta con usar la función copy de la data class. De esta manera, podemos mantener la base del tema pero añadir, por ejemplo, una sombra personalizada mediante la clase Shadow, definiendo su desplazamiento y radio de desenfoque para ganar profundidad.

Dominando estas herramientas, desde la gestión de archivos de fuentes y el aprovechamiento de las variables de Android O, hasta la sofisticación de los gradientes y las cadenas anotadas, conseguimos que la interfaz no solo sea funcional, sino que tenga un acabado profesional y pulido que mejora drásticamente la experiencia de usuario en cualquier aplicación moderna. Comparte esta guía y más usuarios sabrán del tema.

Guía Completa para Implementar Material Design 3 en Jetpack Compose

Actualidad en Androidsis - Vie, 19/06/2026 - 23:20

Si te estás lanzando al mundo de Android, probablemente te hayas dado cuenta de que la era de pelearse con archivos XML interminables para definir estilos ha quedado atrás. Con la llegada de Jetpack Compose, el diseño de interfaces ha dado un giro de 180 grados, permitiéndonos definir la estética de nuestra aplicación directamente en Kotlin. Ya no hace falta ser un mago de los estilos para lograr que una app se vea profesional; ahora todo fluye de manera mucho más natural y declarativa.

En este sentido, Material Design 3 (también conocido como M3 o Material You) se presenta como la herramienta definitiva para crear experiencias que no solo sean funcionales, sino que tengan alma. No se trata solo de poner botones bonitos, sino de implementar un sistema completo donde el color, la tipografía y las formas trabajan juntos para guiar al usuario. Vamos a desgranar cómo aterrizar estos principios en tus componentes de Compose para que tus interfaces pasen de ser correctas a ser sencillamente espectaculares.

La columna vertebral: MaterialTheme

Para que todo el despliegue visual funcione, necesitamos un núcleo que distribuya las reglas de estilo. En Compose, esto se consigue envolviendo el contenido de la aplicación en el elemento MaterialTheme. Este componente es el encargado de gestionar los tres pilares fundamentales: el esquema de colores, la escala tipográfica y las formas de los contenedores. Cuando modificas un valor aquí, el cambio se propaga automáticamente a todos los componentes de M3 que estés utilizando, lo que ahorra un tiempo 말 increíble.

Es común crear una función Composable personalizada, como AppTheme, que determine si se debe aplicar la paleta clara o la oscura basándose en isSystemInDarkTheme(). De esta forma, la aplicación se adapta al entorno del sistema operativo sin que el desarrollador tenga que intervenir manualmente en cada pantalla.

Dominando la paleta de colores y el dinamismo

El sistema de color en M3 es mucho más sofisticado que en versiones anteriores. Ya no hablamos solo de un color primario y uno secundario, sino de un conjunto de roles. Tenemos colores base como primary, secondary y tertiary, pero lo realmente interesante son los contenedores (como primaryContainer) y los colores de contenido (onPrimary), que aseguran que el texto sea siempre legible sobre el fondo.

  • Color Dinámico: Esta es la joya de la corona de Material You. A partir de Android 12 y su nueva interfaz, el sistema puede extraer colores del fondo de pantalla del usuario para generar un esquema de colores personalizado. En Compose, esto se implementa mediante funciones como dynamicLightColorScheme.
  • Roles de énfasis: El color primario se reserva para las acciones más importantes, mientras que el secundario se usa para elementos menos destacados, como chips de filtro. El terciario sirve para crear contrastes acentuados y dirigir la mirada del usuario hacia puntos específicos.
  • Tonal Elevation: A diferencia de las sombras tradicionales, M3 utiliza superposiciones de color tonal. Cuanto más elevación tenga una superficie, más se mezclará el color primario con el fondo, creando una separación visual más orgánica.

Para quienes no quieren romperse la cabeza eligiendo tonos, herramientas como el Material Theme Builder permiten exportar directamente el código de Color.kt y Theme.kt, facilitando la transición desde la marca de la empresa hacia el código real.

Tipografía y jerarquía visual

Olvídate de definir tamaños de fuente al azar en cada texto. Material 3 propone una escala de escritura simplificada dividida en categorías: display, headline, title, body y label, cada una con variantes grande, mediana y pequeña. Esta estructura garantiza que haya un ritmo visual coherente en toda la aplicación.

Para implementar esto, se utiliza la clase Typography, donde puedes sobrescribir los estilos predeterminados usando TextStyle. Es fundamental prestar atención al interlineado (lineHeight) y al espaciado entre letras para mejorar la legibilidad. Una vez definida la tipografía, se accede a ella mediante MaterialTheme.typography.titleLarge, asegurando que cualquier cambio global en el tema se refleje en todos los textos de la app.

El lenguaje de las formas

Las formas en M3 no son solo esquinas redondeadas; son herramientas para comunicar el estado y la marca. El sistema define categorías como extraSmall, small, medium, large y extraLarge. Dependiendo del componente, el sistema asignará una forma u otra: un botón suele usar la forma pequeña, mientras que un diálogo podría usar la mediana.

En Compose, podemos personalizar estas formas en el archivo Shape.kt usando RoundedCornerShape o incluso CutCornerShape si buscamos un look más agresivo. Además, es posible aplicar estas formas mediante modificadores como Modifier.clip() o directamente en el parámetro shape de componentes como Card o FloatingActionButton.

Hacia la expresividad: Material 3 Expressive (M3E)

Google ha llevado el diseño un paso más allá con la versión Expressive, que se convierte en la estrella de Android 16. M3E no es solo un cambio cosmético, sino una evolución basada en la psicología del usuario para crear interfaces más humanizadas y emocionales. El objetivo es que la interacción no sea puramente transaccional, sino que genere satisfacción.

Entre las novedades más potentes destacan las animaciones elásticas (spring-based), que hacen que los elementos se muevan de forma más orgánica y natural, imitando la física del mundo real. También se introduce una biblioteca expandida con hasta 35 formas distintivas y la capacidad de realizar transiciones suaves entre ellas (shape-morphing), elevando la sofisticación visual de la interfaz.

Componentes de navegación y adaptabilidad

Un aspecto crítico es cómo la app se comporta en diferentes tamaños de pantalla. M3 ofrece componentes específicos para cada caso: el NavigationBar es ideal para móviles con pocos destinos, mientras que el NavigationRail funciona mejor en tablets en modo horizontal. Para pantallas grandes, el NavigationDrawer permite mostrar más detalles sin saturar la vista.

La clave aquí es la ergonomía y la accesibilidad. No basta con que sea bonito; debe ser usable. Por ello, es vital respetar los contrastes de color (usando siempre la pareja color y onColor) y aprovechar que los componentes de Material 3 ya vienen con estándares de accesibilidad integrados para usuarios con discapacidades visuales o motoras.

Al final del día, integrar Material Design 3 en Jetpack Compose se resume en aprovechar el poder de MaterialTheme para centralizar la estética, permitiendo que el desarrollo sea más rápido y la interfaz sea coherente. Desde el uso de colores dinámicos que reflejan la identidad del usuario hasta la implementación de animaciones elásticas y tipografías jerarquizadas, el ecosistema de Android ofrece hoy una flexibilidad sin precedentes para crear productos digitales que sean atractivos, accesibles y profundamente expresivos. Comparte la información y más usuarios sabrán del tema.

Interoperabilidad en Android: Guía para integrar Vistas XML en Jetpack Compose

Actualidad en Androidsis - Vie, 19/06/2026 - 23:20

Si llevas un tiempo desarrollando para Android, sabrás que el salto hacia Jetpack Compose ha sido un auténtico cambio de paradigma. Pasar de definir interfaces en archivos XML a escribir código declarativo en Kotlin no es solo un cambio de sintaxis, sino una forma totalmente distinta de entender cómo se construye la UI, alejándonos de las órdenes imperativas para centrarnos en cómo debe verse la pantalla según el estado actual.

Lo mejor de todo es que no hace falta tirar todo el código antiguo a la basura para empezar. Google ha diseñado Compose pensando en una migración progresiva y segura, permitiendo que los componentes modernos y las vistas legacy convivan en la misma aplicación sin que la app explote en el intento. A continuación, desglosamos a fondo cómo lograr que estas dos tecnologías se lleven bien.

El camino hacia la migración de temas

Cuando decides dar el paso, el diseño visual es lo primero que choca. En el mundo de las vistas tradicionales, dependemos de Material Design a través de AppCompat o MDC-Android (versiones 1, 2 y 3). Por otro lado, Compose ofrece sus propias implementaciones de Material 2 y Material 3. Para que la app no parezca un Frankenstein visual, es vital aplicar un MaterialTheme antes de cualquier elemento componible que emita interfaz.

Si tu proyecto ya utiliza Material 3 en XML, lo ideal es que estandarices la versión también en Compose, pudiendo profundizar en la guía definitiva para explorar Material 3 Expressive. Recuerda que los componentes como botones o textos dependen totalmente de este tema; si no lo defines, el comportamiento de la UI es básicamente impredecible y podría dar problemas de renderizado.

Integración de Compose en layouts XML

Para meter un trozo de Compose dentro de un diseño basado en XML, la herramienta clave es el ComposeView. Básicamente, añades este componente en tu archivo de layout y, desde el código Kotlin, utilizas la función setContent para inyectar tus funciones @Composable. Un detalle fundamental aquí es configurar la estrategia de composición, utilizando DisposeOnViewTreeLifecycleDestroyed para evitar fugas de memoria y asegurar que el ciclo de vida de una aplicación de Android se gestione correctamente.

Si necesitas hacer el proceso inverso, es decir, crear un componente basado en Compose que pueda ser usado como si fuera una vista tradicional en XML, debes extender de AbstractComposeView. En este caso, creas una clase que actúe como wrapper, donde el método Content se encarga de renderizar el Composable, permitiendo que el componente sea totalmente reutilizable en cualquier parte de la app, independientemente de la tecnología de la pantalla.

Gestión de estados y la Fuente de Confianza

Uno de los puntos más peliagudos es decidir quién manda sobre los datos. En el desarrollo moderno, aplicamos el Flujo Unidireccional de Datos (UDF). Si Compose y el sistema de vistas deben compartir información, lo más sano es encapsular ese estado en un ViewModel que exponga flujos de datos actualizables para ambas plataformas.

Si Compose es el dueño de la verdad, puedes usar SideEffect para enviar actualizaciones al sistema de vistas. Por el contrario, si el sistema de vistas es el propietario, se recomienda utilizar mutableStateOf para que la comunicación sea segura entre hilos y Compose pueda reaccionar instantáneamente a los cambios del estado mutable.

Arquitectura y ViewModels en entornos mixtos

El uso de ViewModels es fundamental, pero hay que tener ojo con el alcance del ciclo de vida. Al llamar a viewModel() dentro de un Composable, se obtiene una instancia ligada al dueño del ciclo de vida (como la Actividad o el Fragmento). Para evitar errores, no pases el ViewModel directamente a componentes hijos; es mucho mejor pasar solo los datos necesarios y las funciones de callback.

Si utilizas la librería de navegación de Jetpack, el alcance del ViewModel se ajusta al destino del gráfico de navegación, lo que permite que se cree una instancia fresca cada vez que el usuario navega a una pantalla nueva, limpiando la memoria cuando el destino desaparece de la pila.

Pruebas, RecyclerView y WindowInsets

Para testear una interfaz híbrida, ya no basta con ActivityScenarioRule. Ahora debemos recurrir a createAndroidComposeRule, que combina la capacidad de probar elementos de Compose y vistas tradicionales simultáneamente. En cuanto al rendimiento, si necesitas meter elementos componibles dentro de un RecyclerView, asegúrate de usar la versión 1.3.0-alpha02 o superior para evitar tirones y optimizar la carga.

Finalmente, el tema de los WindowInsets puede ser un dolor de cabeza. Cuando tienes una jerarquía mixta, debes decidir explícitamente quién consume las inserciones de la pantalla. Si el diseño externo es de View, este debe consumirlas y Compose debe ignorarlas; si el root es Compose, haz lo contrario y ajusta el padding en los AndroidView según sea necesario para que el contenido no quede oculto tras la barra de estado, similar a como se hace al activar la barra de navegación transparente en Android.

Dominar la convivencia entre el sistema imperativo y el declarativo permite que las aplicaciones evolucionen sin necesidad de reescribirlas desde cero, aprovechando la reducción de código y la independencia del sistema operativo que ofrece Compose mientras se mantiene la estabilidad de las vistas legacy mediante una gestión coherente del estado y el ciclo de vida. Comparte la guía y más usuarios conocerán del tema.

Guía Completa de Jetpack Compose: Domina la UI Declarativa en Android

Actualidad en Androidsis - Vie, 19/06/2026 - 23:20

Si te dedicas al desarrollo de software, ya sabrás que montar una interfaz de usuario que no dé guerra suele ser un quebradero de cabeza. Durante años, los que programamos en Android estuvimos encadenados al sistema de XML, donde teníamos que irle diciendo a la aplicación paso a paso cómo cambiar cada elemento, un proceso imperativo que a menudo resultaba tedioso y propenso a errores.

Pero las cosas han cambiado a pasos agigantados. Hemos entrado en la era de Jetpack Compose, el toolkit nativo de Google que ha venido a romper los esquemas. Básicamente, se trata de dejar de pelearse con archivos externos y empezar a diseñar la UI directamente en Kotlin, haciendo que el desarrollo sea mucho más ágil y, sobre todo, más intuitivo para cualquiera que quiera modernizar sus aplicaciones.

El salto conceptual: Del «cómo» al «qué»

Para los desarrolladores más curtidos, el mayor reto no es el código, sino la mentalidad. El antiguo enfoque imperativo era como darle instrucciones detalladas a un robot: buscabas el elemento por su ID y le ordenabas cambiar el texto o hacerse visible. En cambio, con Compose adoptamos un enfoque declarativo. Aquí no damos órdenes de cambio, sino que describimos el estado final que queremos ver en pantalla.

En lugar de manipular vistas, definimos funciones que emiten la interfaz basándose en los datos actuales. Lo mejor de todo es que, cuando los datos varían, el framework actualiza inteligentemente solo los trozos de la pantalla que han cambiado, eliminando así gran parte del código repetitivo y esos fallos tan molestos de sincronización entre la lógica y lo que el usuario ve.

Construyendo con Funciones @Composable

En este nuevo ecosistema, los ladrillos fundamentales son las funciones anotadas con @Composable. Ya no necesitamos clases gigantescas ni layouts en XML; ahora todo se reduce a componer pequeñas funciones reutilizables que el compilador de Compose procesa de forma especial para gestionar la renderización.

Para que estas funciones trabajen como es debido, deben seguir unas reglas básicas: tienen que ser rápidas y sin efectos secundarios, ya que pueden ejecutarse muchísimas veces por segundo, especialmente durante las animaciones. Además, Compose puede ejecutar estas funciones en paralelo o en cualquier orden para optimizar el rendimiento al máximo.

Tu primer contacto con la UI

Para crear un simple texto, ya no hace falta un TextView. Usamos el componente Text dentro de una función Composable. Una herramienta que te salva la vida aquí es la anotación @Preview, que te permite ver cómo queda el diseño en tiempo real dentro de Android Studio sin tener que lanzar el emulador cada dos minutos.

El poder de los Modifiers

Si quieres añadir margen, cambiar colores o gestionar eventos de clic, entran en juego los Modifiers. En lugar de tener mil atributos diferentes en un XML, Compose centraliza todo en este sistema de decoración secuencial. Al encadenar modificadores, puedes definir el estilo y el comportamiento de un elemento de forma flexible, recordando que el orden en que los aplicas puede alterar el resultado visual.

Organizando la interfaz y el flujo de datos

Para maquetar pantallas más complejas, Compose nos ofrece tres pilares básicos: Column para apilar elementos verticalmente, Row para colocarlos de lado a lado y Box para encimar componentes, funcionando de forma similar al antiguo FrameLayout.

Entendiendo el Estado y la Recomposición

Una aplicación que no reacciona es solo un dibujo. Aquí es donde entra el concepto de Estado (State), que es básicamente cualquier valor que cambie y afecte a la UI. Cuando un estado varía, ocurre la Recomposición: el proceso donde Compose vuelve a ejecutar las funciones afectadas para reflejar el nuevo valor en la pantalla.

Para gestionar esto, usamos mutableStateOf para crear valores observables y remember para que el sistema no olvide la información cada vez que la función se vuelva a ejecutar. Esta combinación permite que la interfaz sea totalmente reactiva a las acciones del usuario.

La Elevação del Estado (State Hoisting)

A medida que la app crece, dejar que un componente gestione su propio estado puede ser un problema de arquitectura. Para evitar que el código se vuelva un caos, aplicamos el State Hoisting. Consiste en mover el estado hacia un componente padre, convirtiendo al hijo en un Composable stateless (sin estado).

El hijo solo recibe el valor actual y notifica los eventos mediante lambdas, mientras que el padre controla la lógica. Esto crea un Flujo de Datos Unidireccional (UDF): los datos bajan y los eventos suben, lo que hace que la aplicación sea mucho más fácil de testear y escalar siguiendo patrones como MVVM.

Innovaciones y el Futuro de Android

El ecosistema no se detiene y la IA generativa se está integrando profundamente. Google ha introducido la API Prompt para Gemini Nano, permitiendo que los modelos de IA procesen datos directamente en el dispositivo, mejorando la privacidad y la velocidad. Además, herramientas como Firebase AI Logic están facilitando la creación de funciones multimodales que procesan audio, texto e imágenes de forma fluida.

Para los desarrolladores, la productividad ha dado un salto con el Modo Agente de Android Studio, capaz de planificar y ejecutar cambios complejos en múltiples archivos basándose en lenguaje natural. Asimismo, la llegada de Android XR abre la puerta a experiencias espaciales inmersivas, apoyándose en el SDK Jetpack XR para adaptar apps móviles a entornos de realidad extendida.

Novedades en Navegación y Rendimiento

La reciente versión beta de Jetpack Navigation 3 redefine la forma de movernos entre pantallas, basándose enteramente en Compose State. Esto significa que la navegación ahora es completamente declarativa y adaptable. Respecto al rendimiento, aunque la carga inicial puede variar, la recomposición inteligente hace que las interfaces dinámicas sean más eficientes que el antiguo sistema de vistas.

Desde la interoperabilidad con XML mediante ComposeView hasta la gestión de listas masivas con LazyColumn y LazyRow, el camino está trazado. La clave para dominar esta tecnología es la práctica constante, aprovechando los Codelabs y la documentación oficial para convertir el código estático en experiencias vivas y fluidas.

La transición hacia un modelo declarativo no solo simplifica la escritura de código, sino que redefine la arquitectura de las apps mediante el control preciso del estado y la optimización de la recomposición. Al integrar estas bases con las nuevas capacidades de IA en Android Studio y las posibilidades de Android XR, el desarrollo de interfaces se vuelve una experiencia más potente, modular y orientada al rendimiento, dejando atrás la rigidez del XML para abrazar la flexibilidad total de Kotlin. Comparte la guía y más usuarios sabrán del tema.

Guía Completa de Navegación Avanzada en Jetpack Compose

Actualidad en Androidsis - Vie, 19/06/2026 - 23:19

Si te has lanzado a la aventura de desarrollar con Jetpack Compose, habrás notado que no solo cambia la interfaz, sino que trastoca por completo la forma en la que entendemos el flujo de una aplicación. Olvida los mundos complicados de los Fragmentos tradicionales; aquí nos movemos en un ecosistema donde la navegación se basa en funciones componibles que se intercambian dinámicamente.

Aprender a movernos entre pantallas no es moco de pavo, ya que implica gestionar un estado global que determine qué ve el usuario en cada momento. En este artículo vamos a desgranar desde los conceptos más básicos hasta las técnicas más avanzadas, como el paso de parámetros complejos y la integración de enlaces externos, para que tu app sea robusta y escalable.

Los pilares de Navigation Compose

Para empezar a montar el tinglado, debemos entender que el sistema se apoya en tres patas fundamentales. Primero tenemos el NavController, que es el cerebro encargado de ejecutar los saltos entre pantallas y gestionar la pila de actividades. Luego está el NavGraph, que básicamente es el mapa donde definimos qué rutas existen y a qué componente se asocian. Por último, el NavHost actúa como el contenedor físico que renderiza la pantalla actual según la ruta activa.

Para poner esto en marcha, es vital utilizar rememberNavController() en el nivel más alto de la jerarquía, normalmente en la Activity principal. Esto asegura que el controlador sobreviva a los cambios de configuración y actúe como la fuente de verdad para toda la navegación de la aplicación, integrándose correctamente con el ciclo de vida de una aplicación de Android.

Definición de rutas y gestión del NavHost

Una ruta es, sencillamente, una cadena de texto que identifica un destino, muy parecido a cómo funcionan las URLs en la web. Para evitar errores de escritura y mantener el código limpio, una práctica muy recomendada es utilizar clases de tipo enum. De este modo, podemos asociar cada ruta a un valor concreto y, si queremos ponernos más detallistas, añadir propiedades como el título de la pantalla directamente en el enum.

El NavHost se configura indicando el controlador y el destino inicial. Dentro de su bloque, utilizamos la función composable() para mapear cada ruta con su respectiva pantalla. Un punto clave aquí es la reutilización de componentes; por ejemplo, si tienes varias pantallas con el mismo diseño pero distintos datos (como una selección de sabores y otra de fechas), puedes usar la misma función componible pasando diferentes parámetros.

Navegación inteligente y flujo de datos

Uno de los errores más comunes es pasar el NavController a todas las pantallas. ¡Ni hablar! Eso rompe la reutilización y complica las previsualizaciones. Lo ideal es elevar la lógica de navegación: las pantallas deben recibir lambdas o callbacks (como un onNextButtonClicked) y dejar que el NavHost decida a dónde ir. Así, la IU es independiente de la lógica de negocio.

Pasando argumentos entre pantallas

Cuando necesitamos que una pantalla sepa qué elemento mostrar (por ejemplo, el detalle de un producto), utilizamos argumentos en la ruta. Esto se hace añadiendo el parámetro entre llaves, como "detalle/{id}". Podemos definir el tipo de dato, como NavType.IntType, para asegurar que la app no pete al recibir información inesperada.

Para recuperar este dato, accedemos al NavBackStackEntry dentro del NavHost. Desde ahí, extraemos el valor usando arguments?.getString() o el método correspondiente al tipo de dato, pasándolo finalmente como parámetro al componente de la pantalla de detalle.

Optimización de la pila de actividades y UX

Si no controlamos la pila de actividades, el usuario podría terminar con diez copias de la misma pantalla al pulsar repetidamente un botón. Para evitar este caos, usamos el parámetro launchSingleTop = true, que garantiza que solo haya una instancia del destino en la cima. Además, el uso de popUpTo permite limpiar la pila hasta un punto concreto, evitando que el botón de retroceso del sistema se vuelva infinito.

Para que la experiencia sea fluida, podemos activar restoreState = true. Esto permite que, si el usuario navega fuera de una pantalla y luego vuelve, se conserve la posición del scroll y los datos introducidos, evitando que la pantalla se recargue desde cero y dando una sensación de mayor velocidad.

Integración de Deep Links e Intents externos

La navegación no tiene por qué limitarse al interior de la app. Los Deep Links permiten que un enlace externo (como un email o una notificación) abra una pantalla específica. Esto requiere configurar un intent-filter en el archivo AndroidManifest.xml definiendo el esquema y el host (por ejemplo, rally://cuenta).

En el NavHost, añadimos la propiedad deepLinks al destino correspondiente usando navDeepLink. Así, el sistema reconoce la URL y redirige al usuario automáticamente. Por otro lado, para interactuar con otras aplicaciones del sistema (como compartir un pedido), utilizamos los Intents de Android, específicamente ACTION_SEND, configurando el tipo de contenido como texto plano y lanzando el chooser del sistema.

Sincronización de la AppBar con la navegación

Para que el usuario no se pierda, la barra superior debe reaccionar al cambio de pantalla. Podemos lograr esto observando el estado actual de la navegación mediante currentBackStackEntryAsState(). Al obtener la ruta activa, podemos actualizar el título de la TopAppBar dinámicamente.

Es fundamental implementar el botón Up (la flecha de volver). Este solo debe ser visible si existe una pantalla previa en la pila, lo cual comprobamos verificando que previousBackStackEntry no sea nulo. Al pulsarlo, ejecutamos navController.navigateUp() para regresar un paso atrás de forma natural.

Estrategias de Testing para la navegación

Probar la navegación puede ser un quebradero de cabeza si no se hace bien. La clave es usar la librería navigation-testing y el TestNavHostController. En lugar de probar la Activity completa, creamos un entorno de prueba donde instanciamos el NavHost y verificamos que, tras un clic, el nodo con el contentDescription de la pantalla de destino esté visible.

También es muy útil comparar la ruta actual del controlador con la ruta esperada usando aserciones de JUnit. Esto nos permite validar flujos complejos sin necesidad de interactuar visualmente con cada elemento, asegurando que la lógica de enrutamiento sea sólida antes de desplegar la app a producción.

Dominar el ecosistema de navegación en Compose implica pasar de un esquema rígido de actividades a un flujo flexible basado en estados y rutas. Desde la configuración básica del NavHost y el uso de enums para evitar errores, hasta la implementación de argumentos dinámicos, Deep Links y una gestión eficiente de la pila de actividades con launchSingleTop, el objetivo es siempre el mismo: crear una experiencia de usuario intuitiva y un código mantenible que facilite las pruebas automatizadas y la escalabilidad del proyecto. Comparte la guía y más usuarios conocerán del tema.

Guía Completa para Crear Listas Infinitas y Eficientes con LazyColumn y LazyRow en Jetpack Compose

Actualidad en Androidsis - Vie, 19/06/2026 - 23:19

Cuando nos ponemos manos a la obra con el desarrollo de aplicaciones modernas, es muy común que necesitemos mostrar una cantidad ingente de datos, ya sea una lista de contactos, un feed de noticias o una galería de fotos. Si intentamos meter todo eso en un contenedor simple, la app se quedaría colgada antes de que el usuario pudiera siquiera hacer un gesto de scroll, ya que el sistema intentaría renderizar miles de elementos a la vez, fundiendo la batería y saturando la memoria del dispositivo.

Para evitar que nuestra interfaz se vuelva lenta como una tortuga, Jetpack Compose nos ofrece herramientas llamadas componentes diferidos o «lazy». Básicamente, estos componentes son los herederos espirituales del antiguo RecyclerView, pero con una sintaxis mucho más limpia y potente que hace que programar listados sea, sinceramente, pan comido comparado con el pasado.

¿Cuándo usar Column y Row frente a las versiones Lazy?

Si tienes un grupo pequeño de elementos que sabes que no van a crecer mucho y que no requieren desplazamiento, usar Column o Row es la opción más directa. Simplemente iteras la lista con un forEach y listo. Incluso puedes añadir el modificador verticalScroll() para que la pantalla se mueva, pero ojo: esto es una trampa para el rendimiento si la lista es larga, porque todos los elementos se componen independientemente de si el usuario los está viendo o no.

Aquí es donde entran en juego LazyColumn y LazyRow. Estos componentes solo renderizan los elementos que están dentro del viewport (el área visible). En cuanto un elemento sale de pantalla, el sistema lo «recicla» para usarlo en el siguiente que va a entrar, lo que garantiza que la app vuele aunque tengas diez mil registros.

Dominando el DSL de LazyListScope

A diferencia de los diseños tradicionales, los componentes diferidos no usan un bloque de contenido normal, sino un LazyListScope. Esto es básicamente un lenguaje específico de dominio (DSL) que nos permite definir la estructura de la lista de forma muy flexible. Tenemos varias funciones clave: item() para añadir un elemento único (como un encabezado) y items() para volcar una colección completa de datos.

Si necesitas saber en qué posición estás, existe la variante itemsIndexed(), que te devuelve el índice del elemento actual. Esto es superútil para cambiar el color de fondo de las filas o gestionar clics específicos basados en la posición.

Cuadrículas: LazyVerticalGrid y LazyHorizontalGrid

A veces una lista simple no basta y necesitamos organizar el contenido en celdas. Para ello, Compose dispone de LazyVerticalGrid y LazyHorizontalGrid. Lo más potente aquí es la configuración de las columnas. Podemos usar GridCells.Fixed si queremos un número exacto de columnas, o GridCells.Adaptive, que es la joya de la corona, ya que define un tamaño mínimo para la celda y ajusta la cantidad de columnas automáticamente según el ancho de la pantalla del móvil o tablet.

Si el diseño es más irregular, como el estilo Pinterest, tenemos las cuadrículas escalonadas (StaggeredGrid). Estas permiten que los elementos tengan alturas o anchuras diferentes sin dejar huecos vacíos molestos, manteniendo la eficiencia del renderizado diferido.

Optimización del rendimiento y experiencia de usuario

Para que la lista no se sienta «tosca», es fundamental gestionar el espaciado. Podemos usar contentPadding para dejar un margen general alrededor de toda la lista y Arrangement.spacedBy() para inyectar espacio exacto entre cada ítem. Pero si queremos ir al siguiente nivel, debemos hablar de las claves (keys).

Por defecto, Compose usa la posición como clave. Si mueves un elemento de sitio, el estado se pierde. Al proporcionar una clave estable y única (como el ID de la base de datos), Compose sabe exactamente qué elemento es cuál, permitiendo que el estado recordado se mantenga y que las animaciones de movimiento funcionen a la perfección con el modificador animateItem().

Gestión avanzada del estado y el scroll

Si queremos que nuestra app reaccione a lo que el usuario hace mientras desliza, necesitamos elevar el LazyListState mediante rememberLazyListState(). Con esto podemos saber cuál es el primer elemento visible y así, por ejemplo, mostrar un botón de «volver arriba» solo cuando el usuario haya bajado un poco en la lista.

Para evitar que la interfaz se redibuje constantemente, es recomendable envolver estas comprobaciones en un derivedStateOf(). Además, si queremos controlar el scroll programáticamente, podemos usar animateScrollToItem() dentro de una corrutina para crear transiciones suaves hacia una posición concreta.

Consejos de oro para evitar errores comunes

Un error típico es intentar anidar un LazyColumn dentro de otro componente que ya tiene scroll en la misma dirección; esto lanzará una IllegalStateException. La solución es simple: mete todo dentro de un único LazyColumn y usa item() e items() para organizar las diferentes secciones.

Otro punto crítico es evitar los elementos de 0 píxeles. Si cargas imágenes asincrónicamente sin definir un tamaño previo, el componente lazy pensará que todo cabe en pantalla y renderizará todo de golpe. Es vital establecer un tamaño predeterminado o un marcador de posición (placeholder) para mantener la estabilidad del scroll.

Finalmente, para exprimir al máximo la CPU, conviene usar el parámetro contentType. Esto le dice a Compose qué tipo de elemento es cada uno, permitiendo que reutilice las composiciones solo entre elementos de la misma estructura, evitando así esfuerzos innecesarios de renderizado.

Tener una interfaz fluida depende de elegir el contenedor adecuado según la cantidad de datos, optimizar la reutilización mediante claves y tipos de contenido, y manejar correctamente los estados de desplazamiento para que la navegación sea intuitiva y sin tirones. Comparte la información y ayuda a más personas a que conozcan del tema.

Guía Completa de Gestión de Estado en Jetpack Compose: Dominando remember y mutableStateOf

Actualidad en Androidsis - Vie, 19/06/2026 - 23:19

Si vienes del mundo de las vistas tradicionales de Android, probablemente estés acostumbrado a pelearte con los ID de los XML y a llamar a métodos como setText para actualizar la pantalla. En el universo de Jetpack Compose, el chip cambia por completo: aquí la interfaz de usuario es una función del estado. Esto significa que no andamos empujando cambios manualmente a la vista, sino que definimos cómo debe lucir la app según los datos actuales y dejamos que el framework se encargue de la magia.

Entrar en este flujo declarativo puede costar un pelín al principio, pero una vez que le pillas el truco, te das cuenta de que es mucho más limpio. La clave de todo reside en entender que el estado es cualquier valor que pueda variar con el tiempo, desde un simple contador de likes hasta una base de datos compleja de Room, y que la UI reacciona a esos cambios de forma orgánica.

El corazón de la reactividad: mutableStateOf

Para que Compose sepa que tiene que redibujar una parte de la pantalla, no basta con usar una variable común de Kotlin. Necesitamos algo que el sistema pueda «vigilar». Aquí es donde entra mutableStateOf, que crea un contenedor observable. Cuando el valor dentro de este contenedor cambia, Compose marca todas las funciones que leyeron ese valor como «inválidas» y lanza la recomposición.

Hay varias formas de declarar estos estados para que el código quede más limpio. Podemos usar la sintaxis de delegados de propiedad mediante el operador ‘by’, que nos permite tratar el estado como si fuera una variable normal sin tener que escribir .value todo el rato. Para que esto funcione, no olvides importar getValue y setValue del paquete de runtime de Compose, porque a veces el IDE se hace el sueco y no los pone automáticamente.

La memoria de la composición: el papel de remember

Un error muy típico al empezar es declarar el estado dentro de un composable sin protegerlo. Como la recomposición es básicamente volver a ejecutar la función, las variables normales se reinician en cada ciclo. Si tienes un campo de texto, verás que no escribe nada porque la variable vuelve a quedar vacía milisegundos después de cada tecla pulsada.

Para solucionar esto usamos remember, que almacena el valor en la composición durante la ejecución inicial y lo recupera en las siguientes. Es como decirle a Compose: «Oye, guarda este dato y no lo tires aunque tengas que volver a dibujar el componente». Ahora bien, remember tiene un límite: si rotas el móvil o la actividad se destruye, el dato se pierde. Para esos casos, la solución es rememberSaveable, que guarda la información en un Bundle, permitiendo que el estado sobreviva a los cambios de configuración.

Si necesitas guardar objetos complejos que no entran directamente en un Bundle, tienes varias opciones. Puedes usar la anotación @Parcelize para hacer que tus data classes sean parcelables, o si prefieres más control, implementar un mapSaver o un listSaver para definir exactamente cómo se convierte el objeto en datos guardables y viceversa.

Elevación de Estado (State Hoisting) y Reutilización

Cuando un componente gestiona su propio estado, decimos que es un componente con estado. Esto está bien para cosas muy simples, pero hace que el componente sea difícil de testear y menos flexible. La solución es el State Hoisting, que consiste en subir el estado a un componente padre. De esta forma, el componente hijo se vuelve «stateless» (sin estado) y solo se encarga de mostrar lo que le piden y notificar los cambios.

El patrón estándar es sustituir la variable de estado por dos parámetros: uno para el valor actual y una función lambda para los eventos (como onValueChange). Esto crea un flujo unidireccional de datos donde el estado baja y los eventos suben, lo que evita que tengamos múltiples fuentes de verdad y reduce drásticamente los errores de sincronización.

Gestión Avanzada: Effects, Flows y ViewModels

A medida que la app crece, meter toda la lógica en los composables es un suicidio. Lo ideal es delegar esto a contenedores de estado como los ViewModels. Compose se integra genial con LiveData y Flow. Por ejemplo, puedes usar collectAsStateWithLifecycle para recolectar flujos de forma eficiente, asegurando que la app no consuma batería ni recursos cuando la pantalla no es visible.

Para manejar efectos secundarios, Compose ofrece herramientas específicas. LaunchedEffect permite lanzar corrutinas que se cancelan solas cuando el componente sale de la pantalla, mientras que DisposableEffect es perfecto para tareas de limpieza. Si tienes un valor que depende de otros estados, derivedStateOf es tu mejor aliado, ya que evita que se realicen cálculos costosos en cada recomposición si las dependencias no han cambiado realmente.

Optimización y Rendimiento

No todo es escribir código, también hay que optimizar. La estabilidad es la palabra clave aquí. El uso de tipos inmutables marcados con @Immutable ayuda al compilador de Compose a saber que un objeto no ha cambiado, permitiéndole saltarse la recomposición de ciertos componentes (skipping) y ganar velocidad.

Para listas largas, es imprescindible usar LazyColumn o LazyRow, que solo renderizan lo que es visible en el momento. Además, es recomendable leer el estado lo más abajo posible en el árbol de componentes para que, cuando algo cambie, solo se invalide la pequeña parte de la UI afectada y no toda la pantalla, evitando así tirones en la experiencia del usuario.

Toda esta arquitectura, desde el uso de remember para la memoria local hasta la implementación de MVVM con flujos unidireccionales, permite que el desarrollo de Android sea mucho más predecible. Al separar la lógica de negocio en ViewModels y mantener los componentes de interfaz puros y reactivos, logramos que las aplicaciones sean escalables, fáciles de mantener y, sobre todo, que ofrezcan una navegación fluida y sin errores de estado. Comparte esta información y más usuarios conocerán del tema.

Guía Completa para Gestionar Permisos de Aplicaciones de Forma Amigable

Actualidad en Androidsis - Vie, 19/06/2026 - 23:18

Seguramente te ha pasado que instalas una aplicación y, de repente, empieza a bombardearte con solicitudes para acceder a tu cámara, a tus contactos o a tu ubicación sin que hayas hecho nada todavía. Esa sensación de invasión de la privacidad es precisamente lo que queremos evitar. Para que una app no parezca un software espía, es fundamental implementar una gestión de permisos que sea fluida, lógica y, sobre todo, respetuosa con quien la usa.

No se trata solo de cumplir con los requisitos técnicos de Android o Windows, sino de diseñar una experiencia de usuario (UX) donde el acceso a los datos sensibles tenga sentido dentro del contexto de la aplicación. Si logramos que el usuario entienda por qué necesitamos un permiso y qué beneficio obtendrá a cambio, la probabilidad de que nos lo conceda subirá como la espuma y la confianza en nuestra marca se dispará.

Fundamentos de los permisos en tiempo de ejecución

En el ecosistema actual, especialmente desde Android 6.0, las apps no obtienen todos los permisos al instalarse. Se ejecutan en una especie de zona de pruebas aislada y, si necesitan salir de ahí para tocar datos privados, deben solicitar un permiso de tiempo de ejecución. Si tu app no pide nada arriesgado o corre en versiones muy antiguas, el sistema lo hace todo en automático, pero en los casos modernos, el flujo debe estar muy bien medido.

Para no dar un mal paso, hay que seguir unos principios básicos. Lo primero es solicitar el acceso justo cuando el usuario interactúe con la función que lo requiere. No hay nada más molesto que pedir el micrófono al abrir la app por primera vez si el usuario solo quiere leer un texto. Además, nunca debemos bloquear al usuario; si alguien no quiere dar un permiso, debemos ofrecerle una degradación elegante, es decir, que la app siga funcionando aunque sea con menos opciones, en lugar de cerrarse o dar un error crítico.

El flujo de trabajo ideal para solicitar accesos

Antes de lanzar cualquier petición, lo más inteligente es evaluar si realmente es necesaria. Hay un montón de tareas que se pueden resolver sin declarar permisos complejos. Si después de analizarlo ves que es inevitable, el camino a seguir es este:

  • Declaración en el manifiesto: Primero, avisa al sistema en el archivo de configuración de la app qué permisos podrías necesitar.
  • Diseño de la UX: Crea una conexión clara entre la acción del usuario y el permiso solicitado.
  • Verificación previa: Antes de pedir nada, comprueba con ContextCompat.checkSelfPermission() si ya tienes el permiso concedido para no repetir procesos.
  • Justificación educativa: Si el sistema indica que es necesario mediante shouldShowRequestPermissionRationale(), muestra una pantalla breve explicando los beneficios de conceder el acceso.
  • Llamada al sistema: Usa el contrato RequestPermission de AndroidX para que el sistema gestione el diálogo de forma sencilla.

Una vez que el usuario responde, hay que gestionar la respuesta. Si acepta, ¡estamos dentro! Pero si rechaza, es vital sin sonar insistente. Acosar al usuario para que cambie de opinión es la receta perfecta para que desinstalen tu aplicación inmediatamente.

Particularidades de la ubicación y privacidad avanzada

El tema de la ubicación es un mundo aparte porque tiene matices importantes. No es lo mismo saber dónde estás mientras usas la app que rastrearte todo el día. El acceso en primer plano es el habitual para navegación o compartir dónde estás en un chat. Pero si necesitas el acceso en segundo plano, como para permitir que aplicaciones funcionen en segundo plano, Android 10 en adelante exige declarar el permiso ACCESS_BACKGROUND_LOCATION.

Además, desde Android 11 existen los permisos únicos. El usuario puede elegir la opción «Solo esta vez», lo que concede un acceso temporal que caduca al cerrar la app o después de un tiempo breve. Esto es una herramienta brutal para la privacidad, ya que el usuario siente que mantiene el control total sobre sus datos.

Gestión de permisos en entornos corporativos y Windows

Cuando hablamos de empresas, el juego cambia. Los administradores de G Suite o entornos corporativos pueden gestionar los permisos de runtime de forma centralizada mediante la virtualización de aplicaciones y perfiles de trabajo. Pueden decidir si permitir automáticamente, denegar o dejar que el usuario elija, especialmente en perfiles de trabajo. Esto evita que cada empleado tenga que configurar manualmente cada herramienta de productividad.

Por otro lado, en Windows 11 y 10, la gestión se hace a través de la página de Privacidad y Seguridad en la Configuración. Aquí se puede controlar qué apps acceden a la cámara o al micrófono. Es importante notar que las aplicaciones de escritorio tradicionales suelen tener un acceso más amplio al sistema, mientras que las de la Microsoft Store están mucho más restringidas y son más fáciles de auditar.

Riesgos y seguridad: qué vigilar

No todos los permisos son inocuos. Algunos pueden comprometer seriamente la seguridad del dispositivo. Los privilegios de administrador o root son los más peligrosos, ya que permiten modificar contraseñas o acceder al núcleo del sistema operativo. Se recomienda no conceder estos accesos a menos que se confíe plenamente en el desarrollador.

Otros permisos comunes, como el de SMS o contactos, pueden ser usados por aplicaciones maliciosas para el phishing o la venta de datos a terceros. Por eso, es recomendable revisar periódicamente el gestor de permisos del dispositivo y eliminar los accesos de aquellas aplicaciones que ya no utilizamos o que nos resultan sospechosas.

Para mantener una app saludable, es clave gestionar correctamente las denegaciones permanentes y utilizar herramientas de depuración como adb shell dumpsys package para verificar el estado de los permisos durante las pruebas. Al final, el éxito de una aplicación radica en el equilibrio entre la funcionalidad técnica y el respeto absoluto a la privacidad del usuario, asegurando que cada solicitud de acceso sea justificada, oportuna y transparente. Comparte la información para que otros usuarios conozcan del tema.

Guía Completa para Crear y Personalizar Menús y Barras de Herramientas Modernas

Actualidad en Androidsis - Vie, 19/06/2026 - 23:17

Seamos sinceros, hay cosas en la vida que son sencillamente perfectas: el olor a café recién hecho por la mañana, el puré de patatas de la abuela o esos vaqueros viejos que, aunque se hayan estirado un poco, siguen siendo la prenda más cómoda del mundo. Sin embargo, si hablamos de interfases de usuario, específicamente de las barras de herramientas y los menús, es probable que muy poca gente los ponga en esa misma lista de perfección. A menudo se sienten rígidos o abrumadores, pero la magia reside en que no tienen por qué ser así.

Cuando empezamos a usar un programa nuevo, la configuración de fábrica nos sirve para no perdernos, pero llega un punto en que necesitamos que el software se adapte a nosotros y no al revés. Ya sea que estés programando una extensión o simplemente quieras optimizar tu espacio de trabajo, saber cómo mover, añadir o quitar elementos es fundamental para que las herramientas que más usas estén siempre a un clic de distancia y el resto no te estorben mientras trabajas.

Personalización de Barras de Herramientas en Entornos de Diseño

En aplicaciones como LayOut, la capacidad de modificar el entorno es clave. No te tienes que aguantar con lo que viene por defecto; puedes incorporar comandos recurrentes para ahorrar tiempo o eliminar esos botones que jamás tocas y que solo sirven para ensuciar la pantalla. Además, tienes la libertad de ajustar el tamaño de los iconos para que se adapten a tu vista y a la resolución de tu monitor.

Si trabajas en Windows, el proceso suele ser bastante intuitivo. Primero, debes asegurarte de que la barra que quieres tocar esté visible desde el menú de vista. Luego, accediendo a las opciones de personalización, podrás abrir un cuadro de diálogo donde, mediante la pestaña de comandos, simplemente arrastras lo que necesites hacia la barra. Si te has pasado de frenada y quieres quitar algo, basta con arrastrar la herramienta fuera de la zona activa. Y si quieres clonar un botón en otra barra, el truco está en mantener pulsada la tecla CTRL mientras mueves el elemento.

Implementación Técnica en Visual Studio (VSIX)

Para quienes están al otro lado del código, crear una barra de herramientas en el IDE de Visual Studio implica un proceso más estructurado. Una toolbar no es más que una franja, ya sea vertical u horizontal, que vincula botones con comandos específicos. Lo interesante aquí es que el IDE gestiona la personalización del usuario, lo que significa que el desarrollador no necesita saber la ubicación física del comando, solo debe definir su comportamiento.

El proceso técnico comienza creando un proyecto VSIX. Es crucial definir los símbolos de identificación (GUIDs) tanto para la barra como para el grupo de herramientas en el archivo de configuración. Posteriormente, se debe definir el menú con el tipo Toolbar y asignar las etiquetas de texto correspondientes. Un punto vital es que las barras de herramientas no permiten anidación como submenús, por lo que su organización es plana y flexible, permitiendo que el usuario final decida dónde acoplarlas en la ventana principal.

Optimización de Menús y Cintas en BricsCAD

En el ecosistema de BricsCAD, la personalización se extiende más allá de las barras tradicionales, llegando hasta la cinta o ribbon. Para modificar los menús contextuales (esos que aparecen al hacer clic derecho), se utiliza el comando de personalización donde puedes insertar nuevos elementos, como la opción de exportar a PDF, simplemente expandiendo los nodos del menú de archivo.

En cuanto a la cinta, el sistema se divide en pestañas y paneles. Para mejorar la eficiencia, puedes anexar nuevos paneles a una pestaña existente o insertar botones de comando específicos, como la herramienta de ajuste de polilíneas. Si en algún momento sientes que has hecho un desastre con la configuración, siempre existe la opción de revertir a los valores predeterminados, lo que te devuelve al estado original del espacio de trabajo sin complicaciones.

Gestión Avanzada de Elementos en ARCHICAD

ARCHICAD ofrece un control muy granular sobre cómo se muestran los comandos. A través de su cuadro de diálogo de entorno de trabajo, es posible elegir si un botón debe mostrar solo el icono, solo el nombre o una combinación de ambos. Existe incluso una opción selectiva donde el icono es permanente pero el nombre solo aparece en los comandos que tú decidas marcar.

Una funcionalidad muy útil es la de los menús desplegables adhesivos. Esto permite que un menú se visualice como una pequeña flecha negra asociada al ítem anterior, optimizando el espacio y agrupando funciones relacionadas. Para organizar el contenido, el software permite usar flechas de desplazamiento para cambiar el orden de los ítems y añadir separadores que ayudan a segmentar visualmente las herramientas según su propósito.

Desafíos de UX en Dispositivos Móviles y Orientación Horizontal

Diseñar barras de herramientas para móviles presenta retos únicos, especialmente en orientación horizontal donde el espacio vertical es oro. El error común es crear barras desplazables que obligan al usuario a hacer scroll infinito, lo cual resulta extremadamente incómodo. Una solución es anclar los elementos críticos (como un menú hamburguesa) para que permanezcan fijos mientras el resto de la barra se desliza.

Para evitar el uso de menús de tres puntos (…) que requieren clics extra, se pueden implementar selectores de estado o pop-ups rápidos. Si tienes un grupo de interruptores donde solo uno puede estar activo, es preferible que el cambio sea instantáneo y no obligue al usuario a abrir y cerrar ventanas. La clave es mantener la mayor área de trabajo posible, evitando expandir la barra a dos filas ya que esto robaría espacio vital a la visualización del contenido principal.

Posicionamiento y Acoplamiento de Interfaces

Finalmente, es fundamental definir la posición de carga de cualquier barra de herramientas mediante archivos de configuración como el CUI. Las opciones suelen variar entre modo flotante o acoplamiento en los bordes superior, inferior, izquierdo o derecho de la pantalla. Esta flexibilidad permite que el usuario configure su entorno según la ergonomía de su monitor y sus hábitos de trabajo.

La capacidad de moldear la interfaz, desde la simple gestión de botones en un programa de diseño hasta la programación de extensiones complejas en un IDE, es lo que permite transformar una herramienta genérica en una estación de trabajo ultra eficiente. Al priorizar la accesibilidad de los comandos y evitar redundancias visuales, se logra que la interacción con el software sea fluida, natural y, sobre todo, productiva. Comparte esta guía y ayuda a otros a conocer del tema.

Páginas

Suscribirse a Tecnoaficiones agregador